wong_。 发表于 2012-5-17 08:39:52

新手求一个简单画图程序,请高手不吝赐教。

先根据已知的两个点测出马路的宽度,然后利用马路一条边上的测量点,pline成线,然后根据马路的宽度平移这条线,就能生成马路的图形。请问这个程序该怎么写?谢谢!

hb198075 发表于 2012-5-17 09:17:01


;;;plst-马路一条边上的测量点,pt-马路另一边上的任一点
(defun drawRoad        (plst pt / oldos oldoffset)
(setq        oldos          (getvar "OSMODE")
        oldoffset (getvar "OFFSETDIST")
)
(setvar "OSMODE" 0)
(setvar "OFFSETDIST" -1.0)
(command "_.pline")
(mapcar 'command plst)
(command "")
(command "_.OFFSET" "" (entlast) pt "")
(setvar "OSMODE" oldos)
(setvar "OFFSETDIST" oldoffset)
)

;;;测试程序
(defun c:tt1 (/ tmp rel pt)
(setvar "CMDECHO" 0)
(while (setq tmp (if tmp
                     (getpoint tmp "\n请输入路边的控制点:")
                     (getpoint "\n请输入路边的控制点:")
                   )
       )
    (setq rel (cons tmp rel))
    (if        (> (length rel) 1)
      (grdraw (car rel) (cadr rel) 1 1)
    )
)
(if (and (> (length rel) 1)
           (setq pt (getpoint "\n请输入偏移点:"))
      )
    (drawRoad rel pt)
)
(redraw)
(princ)
)

wong_。 发表于 2012-5-17 11:42:46

hb198075 发表于 2012-5-17 09:17 static/image/common/back.gif


我这个先要利用已知的txt数据文件生成一条边,txt格式就是:点号,X坐标,Y坐标,高程忽略。数据开始是两个控制点。后面的就是一条边上的点,这个怎么和这个程序联系起来?

mjz521yy 发表于 2012-5-17 17:28:05

后面的就是一条边上的点,这个怎么和这个程序联系起来?

piao1887 发表于 2012-5-17 22:47:57

这个主要是读取文本
READ-LINE 函数看一下

hb198075 发表于 2012-5-18 09:33:15

你没提供文本格式,不好写清楚。
我这个是按如下文本格式写的,每行表示一个点,第一个点和第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)
)
页: [1]
查看完整版本: 新手求一个简单画图程序,请高手不吝赐教。