你没提供文本格式,不好写清楚。
我这个是按如下文本格式写的,每行表示一个点,第一个点和第2个点表示计算宽度的两点,从第三点开始才是道路边线,点采用加逗号的形式表示。
还有,建议采用中线坐标点来制作会更简单些,采用边线制作的话还需要指定道路偏移方向的。
 - (defun drawRoad (plst / oldos oldoffset width lst pt)
- (if (> (length plst) 3)
- (progn
- (setq oldos (getvar "OSMODE")
- oldoffset (getvar "OFFSETDIST")
- )
- (setq width (DISTANCE (car plst) (cadr plst))
- lst (cddr plst)
- )
- (setvar "OSMODE" 0)
- (command "_.pline")
- (mapcar 'command lst)
- (command "")
- (redraw (entlast) 4)
- (if (setq pt (getpoint "\n请给出道路偏移方向:"))
- (command "_.OFFSET" width (entlast) pt "")
- )
- (redraw)
- (setvar "OSMODE" oldos)
- (setvar "OFFSETDIST" oldoffset)
- )
- )
- )
- ;;;测试程序
- (defun c:tt2 (/ fpath f pttmp ptlst oldos)
- (setvar "OSMODE" 0)
- (defun stringToPoint (str / n ix iy rel)
- (if (setq n (VL-STRING-SEARCH "," str))
- (setq ix (substr str 1 n)
- iy (substr str (+ n 2) (- (strlen str) n 1))
- rel (list (atof ix) (atof iy))
- )
- )
- )
- (setvar "CMDECHO" 0)
- (and (setq fpath (getfiled "请选择道路坐标点文件:" "" "txt" 4))
- (setq f (open fpath "r"))
- (progn
- (while (setq pttmp (read-line f))
- (if (setq pt (stringToPoint pttmp))
- (setq ptlst (cons pt ptlst))
- )
- )
- (close f)
- )
- )
- (drawroad (REVERSE ptlst))
- (princ)
- )
|