请教头疼的GRREAD函数?
请问如下小程序问题出在哪儿呢?我本意是想实现动态画矩形,虽然动态过程是有了,可是当重新刷心一下屏幕,矩形就消息了,难道grvecs函数并没有真正实现向CAD文档添加矩形对象吗?那该怎样实现真正画出了矩形呢,为何掉用rectang的命令就会画出许多矩形出来?
(defun c:12()
(setq pt (getpoint "\n get point:"))
(while (= (car (setq tmp (grread 4 0))) 5)
(setq mode (car tmp))
(setq po (cadr tmp))
(setqp1(list (car pt) (cadr pt))
p2(list (car pt) (cadr po))
p3(list (car po) (cadr po))
p4(list (car po) (cadr pt))
)
(redraw)
(grvecs (list 7 p1 p2 7 p2 p3 7 p3 p4 7 p4 p1))
)
)
本帖最后由 Andyhon 于 2011-11-6 19:37 编辑
未列自己呗
(command "RectAng" p1 p3) 本帖最后由 xyp1964 于 2011-11-6 19:51 编辑
;; 用grread多余 (defun c:tt (/ p1 p2)
(if (setq p1 (getpoint "\n基点: "))
(if (setq p2 (getcorner p1 "\n对角点: "))
(command "rectang" p1 p2)
)
)
(princ)
) 什么意思,你是说在退出while后加上(command "rectang" pt po)吗?虽然可以实现最后画矩形,但好像跟版上很多类似程序有点偏离。其实我是搞不明白grvecs的具体功能。
而且,就算这个程序没问题了,那么实现同样的动态画圆的程序中在while里应该用什么函数呢? 用grvecs是不在图形数据库中添加图元的。
想要动态的结果一般用grread函数,用光标点来确定图元数据列表,并且要不断更新数据列表。
你这个例子是画矩形,碰巧可以用getcorner生成橡皮线。所以三楼的方法是最简便的。 可能我表达有问题,其实我想问的是如何来实现动态的显示某个对象的生成过程,从而给用户更直观的体验。比如想生成矩形、圆或自定义的图形时,希望它随光标的移动而自动改变大小?我看到版上很多人都用的是grread这个函数来实现,只是我不清楚,while循环里面是如何实现实时更新对象的大小,是否也像其他编程语言那样,先生成新的对象,然后擦除旧的对象? vormittag 发表于 2011-11-6 20:01 static/image/common/back.gif
用grvecs是不在图形数据库中添加图元的。
想要动态的结果一般用grread函数,用光标点来确定图元数据列表, ...
哦,原来如此,由于不在数据库中添加图元,那redraw后屏幕就不会再显示了。
这样的话如何才能在退出while后真正向数据库中添加图元呢(在不用rectang命令的情况下)?
同时向动态画圆,是否也有类似的grvecs函数? 这里有一个小例子,用grread函数,代码如下,仅作参考,写得不够强健和简洁。
(defun c:te(/ pt p pt1 lineell textell)
(while (not (setq pt (getpoint "\n请选择点:"))))
(setq p (grread t 4 0)
pt1 (cadr p)
);setq
(entmake (list '(0 . "LINE") (cons 10 pt) (cons 11 pt1)))
(setq lineell (entget (entlast))
L (distance pt pt1)
Text (strcat "L=" (rtos L))
);setq
(entmake
(list
'(0 . "TEXT")
(cons 1text)
(cons 7(getvar "textstyle"))
(cons 10 pt1)
(cons 40 (getvar "textsize"))
'(50 . 0)
'(41 . 0.7)
'(51 . 0.0)
'(72 . 0)
'(73 . 0)
);list
);entmake
(setq textell (entget (entlast)))
(while (= 5 (car p))
(setq p (grread t 4 0)
pt1 (cadr p)
L (distance pt pt1)
Text(strcat "L=" (rtos L))
);setq
(setq lineell(subst (cons 11 pt1) (assoc 11 lineell) lineell)
textell(subst (cons 10 pt1) (assoc 10 textell) textell)
textell(subst (cons 1 Text) (assoc 1 textell) textell)
);setq
(entmod lineell)
(entmod textell)
);while
(princ)
)效果如图:
vormittag 发表于 2011-11-6 20:57 static/image/common/back.gif
这里有一个小例子,用grread函数,代码如下,仅作参考,写得不够强健和简洁。
效果如图:
谢谢。
你的动态显示的思路我看懂了,确实不错,通过更改DXF中的值来更新对象位置,是个好的方法,这应该也是个通用的动态显示的思路吧。
页:
[1]