逗亦斗霸 发表于 2024-9-25 18:12:26

entmake动态生成带弧度的填充实体时遇到的问题求助,谢谢~

本帖最后由 逗亦斗霸 于 2024-9-25 18:14 编辑

(defun c:tt (/ p0)
(setq p0 (getpoint "\n起点: ")
    pn (getpoint p0 "\n终点: ")
    jd (angle p0 pn)
      p1 (mapcar '+ p0 '(420 0 0) )
      p2 (mapcar '+ p0 '(0 -210 0) )
    jd1 (angle p0 p2)
)
(setq
      pt1(polar p0 jd 420)
      pt2(polar p0 (+ jd jd1) 210)
      pt3(polar pt2 jd 420)
)
(entmake
    (list
   '(0 . "hatch")
       '(100 . "AcDbEntity")
       '(67 . 0)
       '(410 . "Model")
      (cons 8 "0")
       '(100 . "AcDbHatch")
       '(10 0.0 0.0 0.0)
       '(210 0.0 0.0 1.0)
      (cons 2 "SOLID")
       '(70 . 1)
       '(71 . 1)
       '(91 . 1)
       '(92 . 1)
       '(93 . 3)
       '(72 . 1)
       (cons 10 p0)
       (cons 11 pt1)
       '(72 . 2)
       (cons 10 pt3)
       '(40 . 210)
       (cons 50 (+ (* pi (/ jd 180.) ) (/ pi 2) ) )
       (cons 51 (+ (* pi (/ jd 180.) ) pi) )
       '(73 . 1)
       '(72 . 2)
       (cons 10 pt2)
       '(40 . 210)
       (cons 50 (+ (* pi (/ jd 180.) ) (* pi 2) ) )
       (cons 51 (+ (* pi (/ jd 180.) ) (* pi 2.5) ) )
       '(73 . 1)
       '(97 . 0)
       '(75 . 1)
       '(76 . 1)
       '(98 . 1)
       (cons 10 p0)
      '(453 . 2)
      '(463 . 0)
      '(463 . 1)
      '(470 . "LINEAR")
   )
)
(princ)
)此代码水平零角度时可以正常生成我想要的填充样式(图1),但当有角度时则会出现异样(图2和图3),问题应该是出在DXF组码50和51,尝试修改却未成功,现请求大佬指点一下怎么修改?谢谢~

飞雪神光 发表于 2024-9-29 09:01:19

本帖最后由 飞雪神光 于 2024-9-29 09:03 编辑

@统一网名 回复的就是一种答案 我换掉了command(defun c:tt (/ an lastobj num p0 p1 pt pt1 pt2 pt3)
(setq
    p0 (getpoint "\n起点:")
    pt (getpoint p0 "\n终点:")
    num (getint "\n生成数量:<1>")
    pt1(polar p0 0 420)
    pt2(polar p0 (* pi 1.5) 210)
    pt3(polar pt2 0 420)
)
      (or num (setq num 1))
      (entmake
                (list
                        '(0 . "hatch")
                        '(100 . "AcDbEntity")
                        '(67 . 0)
                        '(410 . "Model")
                        (cons 8 "0")
                        '(100 . "AcDbHatch")
                        '(10 0.0 0.0 0.0)
                        '(210 0.0 0.0 1.0)
                        (cons 2 "SOLID")
                        '(70 . 1)
                        '(71 . 1)
                        '(91 . 1)
                        '(92 . 1)
                        '(93 . 3)
                        '(72 . 1)
                        (cons 10 p0)
                        (cons 11 pt1)
                        '(72 . 2)
                        (cons 10 pt3)
                        '(40 . 210)
                        (cons 50 (* pi 0.5))
                        (cons 51 pi)
                        '(73 . 1)
                        '(72 . 2)
                        (cons 10 pt2)
                        '(40 . 210)
                        (cons 50 (* pi 2.))
                        (cons 51 (* pi 2.5))
                        '(73 . 1)
                        '(97 . 0)
                        '(75 . 1)
                        '(76 . 1)
                        '(98 . 1)
                        (cons 10 p0)
                        '(453 . 2)
                        '(463 . 0)
                        '(463 . 1)
                        '(470 . "LINEAR")
                )
      )
      (vla-Rotate (setq lastobj (vlax-ename->vla-object (entlast))) (vlax-3D-point p0) (setq an (angle p0 pt)))
      (repeat (1- num)
                (setq p1 (polar p0 an 420));间距
                (vla-Move (setq lastobj (vla-Copy lastobj)) (vlax-3D-point p0) (vlax-3D-point p1))
                (setq p0 p1)
      )
      (princ)
)

统一网名 发表于 2024-9-26 08:56:42

没有搞明白是咋运行的,但是换个思路可以实现,先平行画一个,然后旋转就可以了。


[*](defun c:tt (/ ang jd jd1 p0 p1 p2 pn pt pt1 pt2 pt3)
[*](setq
[*]    p0 (getpoint "\n起点: ")
[*]    pt (getpoint p0 "\n终点: ")
[*])
[*](setq
[*]    pn (polar p0 0 300)
[*]    jd (angle p0 pn)
[*]    p1 (mapcar '+ p0 '(420 0 0) )
[*]    p2 (mapcar '+ p0 '(0 -210 0) )
[*]    jd1 (angle p0 p2)
[*])
[*](setq
[*]    pt1(polar p0 jd 420)
[*]    pt2(polar p0 (+ jd jd1) 210)
[*]    pt3(polar pt2 jd 420)
[*])
[*](entmake
[*]    (list
[*]      '(0 . "hatch")
[*]      '(100 . "AcDbEntity")
[*]      '(67 . 0)
[*]      '(410 . "Model")
[*]      (cons 8 "0")
[*]      '(100 . "AcDbHatch")
[*]      '(10 0.0 0.0 0.0)
[*]      '(210 0.0 0.0 1.0)
[*]      (cons 2 "SOLID")
[*]      '(70 . 1)
[*]      '(71 . 1)
[*]      '(91 . 1)
[*]      '(92 . 1)
[*]      '(93 . 3)
[*]      '(72 . 1)
[*]      (cons 10 p0)
[*]      (cons 11 pt1)
[*]      '(72 . 2)
[*]      (cons 10 pt3)
[*]      '(40 . 210)
[*]      (cons 50 (+ (* pi (/ jd 180.) ) (/ pi 2) ) )
[*]      (cons 51 (+ (* pi (/ jd 180.) ) pi) )
[*]      '(73 . 1)
[*]      '(72 . 2)
[*]      (cons 10 pt2)
[*]      '(40 . 210)
[*]      (cons 50 (+ (* pi (/ jd 180.) ) (* pi 2) ) )
[*]      (cons 51 (+ (* pi (/ jd 180.) ) (* pi 2.5) ) )
[*]      '(73 . 1)
[*]      '(97 . 0)
[*]      '(75 . 1)
[*]      '(76 . 1)
[*]      '(98 . 1)
[*]      (cons 10 p0)
[*]      '(453 . 2)
[*]      '(463 . 0)
[*]      '(463 . 1)
[*]      '(470 . "LINEAR")
[*]    )
[*])
[*](setq ang(- 360 (* (- (angle p0 pn)(angle p0 pt))(/ 180 pi))))
[*](command "_.rotate" (entlast) "" p0 ang )
[*](princ)
[*])








统一网名 发表于 2024-9-29 09:02:51

逗亦斗霸 发表于 2024-9-26 14:45
恩恩,用command偶会哦,我就是想学用entmake的,那个快呀~

哪个快我也不知道,更改以下代码,你原来的就可以正常运行了      
            (cons 50 (+ jd (/ pi 2.0)))
            (cons 51 (+ jd pi))
                                                                      
            (cons 50 (+ jd (* pi 2.0)))
            (cons 51 (+ jd (* pi 2.5)))

逗亦斗霸 发表于 2024-9-26 10:49:16

统一网名 发表于 2024-9-26 08:56
没有搞明白是咋运行的,但是换个思路可以实现,先平行画一个,然后旋转就可以了。




感谢回复!单独一个的这样确实可以,但我想生成多个的话((entlast) 换成“p”)没有旋转成功。另外我用command来填充的话也可以成功,但数量多的话使用command生成确实要慢不少~

统一网名 发表于 2024-9-26 11:24:01

逗亦斗霸 发表于 2024-9-26 10:49
感谢回复!单独一个的这样确实可以,但我想生成多个的话((entlast) 换成“p”)没有旋转成功。另外我 ...

不明白你说的多个具体是啥情况

逗亦斗霸 发表于 2024-9-26 11:28:40

统一网名 发表于 2024-9-26 11:24
不明白你说的多个具体是啥情况

沿着起点和终点路径生成多个~

统一网名 发表于 2024-9-26 13:54:47

逗亦斗霸 发表于 2024-9-26 11:28
沿着起点和终点路径生成多个~

        (repeat 2                
                (setq d2 (polar p0 (angle p0 pt)440))
                (command "copy" (entlast) "" p0 d2);
                (setq p0 d2)
        )
后面加一个循环复制,次数和间距自己设置吧

逗亦斗霸 发表于 2024-9-26 14:45:24

统一网名 发表于 2024-9-26 13:54
(repeat 2                
                (setq d2 (polar p0 (angle p0 pt)440))
                (command "copy" (entlast) "" p0 d2);


恩恩,用command偶会哦,我就是想学用entmake的,那个快呀~

逗亦斗霸 发表于 2024-9-29 09:27:47

飞雪神光 发表于 2024-9-29 09:01
@统一网名 回复的就是一种答案 我换掉了command

感谢飞版!这就是我想要的,之前的指北角度问题和这个问题都是不会用pi(这段代码里的pi其实也没看太懂:D-)我再去琢磨一下~
页: [1] 2
查看完整版本: entmake动态生成带弧度的填充实体时遇到的问题求助,谢谢~