Happy Hobbit 发表于 2022-7-5 18:03:18

带弧的GRRDRAW

编写如下矩形GRRDRAW函数相对简单,它从一侧的中间绘制一个矩形。有人知道是否有可能创建一个GRRDRAW函数,使其在一端或两端(如图所示)看起来有一个圆弧,而不需要绘制大量的小线段(线),所有这些都需要在代码中内置坐标。我不需要代码来实际绘制形状,只需要它的GRRDRAW部分。
 
(defun c:test (/ pt1 pt2 pt3 pt4 pt5 pt6 wid)
(setq wid (getint "\Width? <10>"))
(if (= wid nil) (setq wid 10))
   (if
   (setq pt1 (getpoint "\nSelect 1st point"))
       (progn
         ;(command "circle" pt1 4.0)
         (while
         (not (= (car (setq pt2 (grread t 15 0))) 3))
         (redraw)
         (if
             (listp (setq pt2 (cadr pt2)))
             (progn
        (setq pt3 (polar pt1 (* pi 0.5) (* wid 0.5))
              pt4 (polar pt1 (* pi 1.5) (* wid 0.5))
              pt5 (polar pt2 (* pi 0.5) (* wid 0.5))
              pt6 (polar pt2 (* pi 1.5) (* wid 0.5)))
                   (grdraw pt3 pt4 1 3)
                   (grdraw pt3 pt5 1 3)
                   (grdraw pt4 pt6 1 3)
                   (grdraw pt5 pt6 1 3)
             )
         )
         )
       )
   )
(command "_pline"
   (list (car pt3) (cadr pt3))
   (list (car pt4) (cadr pt4))
   (list (car pt6) (cadr pt6))
   (list (car pt5) (cadr pt5))
   (list (car pt3) (cadr pt3)) "C")
(redraw)
(princ)
)

Stefan BMR 发表于 2022-7-5 18:10:40

试试这个
 
;Stefan M. 15.02.2016
(defun C:SLOT ( / p1 w n h e p g r p o enter)
(defun 2dp (p1 p2 d)
   (reverse (cdr (reverse (trans (polar p1 (+ (angle p1 p2) (/ pi 2)) d) 1 n))))
   )
(if
   (and
   (setq w (/ (cond ((getdist "\nWidth <10>: ")) (10.0)) 2))
   (setq p1 (getpoint "\nStart point: "))
   )
   (progn
   (setq n (trans '(0 0 1) 1 0 T)
         h (caddr (trans p1 1 n))
         e (entmakex
               (list
               '(0 . "LWPOLYLINE")
               '(100 . "AcDbEntity")
               '(100 . "AcDbPolyline")
               (cons 38 h)
               '(90 . 4)
               '(70 . 1)
               (cons 10 (2dp p1 p1 (- w)))
               '(42 . 0)
               (cons 10 (2dp p1 p1 (- w)))
               '(42 . 1)
               (cons 10 (2dp p1 p1 w))
               '(42 . 0)
               (cons 10 (2dp p1 p1 w))
               '(42 . 1)
               (cons 210 n)
               )
               )
         o (vlax-ename->vla-object e)
         )
   (grread T)
   (while (not enter)
   (setq g (grread t 15 0)
         r (carg)
         p (cadr g)
         )
   (cond
       ((or (member r '(11 12 25)) (= p 13) (= p 32)) (entdel e) (setq enter T))
       ((= r 5)
      (vlax-put o 'coordinates
         (append
             (2dp p1 p (- w))
             (2dp p p1 w)
             (2dp p p1 (- w))
             (2dp p1 p w)
             )
         )
      )
       ((= r 3) (setq enter T))
       )
   )
   )
)
(princ)
)

Happy Hobbit 发表于 2022-7-5 18:21:50

谢谢Stefan,效果很好。我试图找出代码的“预览”部分是什么?实体本身(槽)显然是从entmakex函数创建的,但grrdraw位的等价物在哪里?

Stefan BMR 发表于 2022-7-5 18:26:18

它不使用grdraw。将更新多段线的坐标。(vlax放置o坐标。。。

Happy Hobbit 发表于 2022-7-5 18:35:39

vlax put对我来说是新的。我在网上也找不到太多关于它的信息!不过,这很管用,再次谢谢你,斯特凡

Lee Mac 发表于 2022-7-5 18:40:04

下面是一个使用GRVEC的示例。
 
正如函数名所示,grdraw和grvecs只能创建向量,因此使用多条线段创建圆弧。

Happy Hobbit 发表于 2022-7-5 18:45:43

然而,如果只为一个形状绘制grdraw,而不是实际绘制形状的grdraw,那就太好了。
 
**版主**请将此帖子的标题更改为“GRDRAW with ARCS”,以便于人们搜索。很抱歉输入错误
 
附录:
啊,刚刚注意到你的帖子李,在我上面的第一篇文章中,代码看起来很容易合并到代码中。简单地用定义点的极函数替换第一个点,第二个点可能也可以用同样的方法完成。。。。
我想。。。

Lee Mac 发表于 2022-7-5 18:52:48

这是另一个可能也很有趣的例子:圆切线。
 
以上内容包括grarc和grcircle函数,并演示了如何在grread循环中实现一种形式的对象捕捉。

Happy Hobbit 发表于 2022-7-5 19:03:00

啊哈!李看起来很完美。我已经在Grsnap标题下看到了对它的引用,但找不到演示的代码!
真的非常感谢

Lee Mac 发表于 2022-7-5 19:06:31

不客气!
页: [1]
查看完整版本: 带弧的GRRDRAW