templeecw 发表于 2011-11-6 19:28:43

请教头疼的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:36:37

本帖最后由 Andyhon 于 2011-11-6 19:37 编辑

未列自己呗
(command "RectAng" p1 p3)

xyp1964 发表于 2011-11-6 19:50:52

本帖最后由 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)
)

templeecw 发表于 2011-11-6 19:51:04

什么意思,你是说在退出while后加上(command "rectang" pt po)吗?虽然可以实现最后画矩形,但好像跟版上很多类似程序有点偏离。其实我是搞不明白grvecs的具体功能。
而且,就算这个程序没问题了,那么实现同样的动态画圆的程序中在while里应该用什么函数呢?

vormittag 发表于 2011-11-6 20:01:10

用grvecs是不在图形数据库中添加图元的。
想要动态的结果一般用grread函数,用光标点来确定图元数据列表,并且要不断更新数据列表。
你这个例子是画矩形,碰巧可以用getcorner生成橡皮线。所以三楼的方法是最简便的。

templeecw 发表于 2011-11-6 20:06:33

可能我表达有问题,其实我想问的是如何来实现动态的显示某个对象的生成过程,从而给用户更直观的体验。比如想生成矩形、圆或自定义的图形时,希望它随光标的移动而自动改变大小?我看到版上很多人都用的是grread这个函数来实现,只是我不清楚,while循环里面是如何实现实时更新对象的大小,是否也像其他编程语言那样,先生成新的对象,然后擦除旧的对象?

templeecw 发表于 2011-11-6 20:13:19

vormittag 发表于 2011-11-6 20:01 static/image/common/back.gif
用grvecs是不在图形数据库中添加图元的。
想要动态的结果一般用grread函数,用光标点来确定图元数据列表, ...

哦,原来如此,由于不在数据库中添加图元,那redraw后屏幕就不会再显示了。
这样的话如何才能在退出while后真正向数据库中添加图元呢(在不用rectang命令的情况下)?
同时向动态画圆,是否也有类似的grvecs函数?

vormittag 发表于 2011-11-6 20:57:19

这里有一个小例子,用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)
)效果如图:


templeecw 发表于 2011-11-6 21:35:48

vormittag 发表于 2011-11-6 20:57 static/image/common/back.gif
这里有一个小例子,用grread函数,代码如下,仅作参考,写得不够强健和简洁。
效果如图:

谢谢。
你的动态显示的思路我看懂了,确实不错,通过更改DXF中的值来更新对象位置,是个好的方法,这应该也是个通用的动态显示的思路吧。
页: [1]
查看完整版本: 请教头疼的GRREAD函数?