Bill Tillman 发表于 2022-7-5 17:50:34

如何连接直线和圆弧Int

我有一个相当简单的任务,我取得了良好的进展,直到。。。
 
任务是提出一个lisp例程,该例程将绘制各种角钢的剖面图。这并不太难,但现在我需要将所有的直线和圆弧连接成一个实体,这样我就可以复制、镜像、移动等等。。。轻松自如。
 
现在,你们所有知道我的“全自动”程序的人都记得,这正是那个。完全自动化。不允许用户输入。也就是说,我已经走了多远:

(defun DrawAngleSection ( pt l1 l2 angThk)
(command-s "._CLAYER" "Angles")
(setq a90 (dtr 90.) a270 (dtr 270.))
(command-s "._LINE"
   (polar pt a270 (- angThk (- angThk 0.0625))) pt (polar pt 0 l1) (polar (polar pt 0 l1) a270 l2) (polar (polar pt 0 (- l2 (- angThk (- angThk 0.0625)))) a270 l1) "")
(command-s "._LINE"
   (polar (polar pt 0 (- angThk 0.0625)) a270 angThk) (polar (polar pt 0 (- l1 (* angThk 2))) a270 angThk) "")
(command-s "._LINE"   
   (polar (polar pt 0 (- l1 angThk)) a270 (* angThk 2)) (polar (polar pt 0 (- l1 angThk)) a270 (- l2 (- angThk 0.0625))) "")

(Arc
   (polar (polar pt 0 (- angThk 0.0625)) a270 (- angThk (- angThk 0.0625)))
   (- angThk 0.0625)
   pi
   a270
   )

(Arc
   (polar (polar pt 0 (- l2 (- angThk (- angThk 0.0625)))) a270 (- l1 (- angThk 0.0625)))
   (- angThk 0.0625)
   pi
   a270
   )

(Arc
   (polar (polar pt 0 (- l1 (* angThk 2))) a270 (* angThk 2))
   angThk
   0
   a90
   )

(setq x (sssetfirst nil (ssget "X" (list (cons 8 (getvar "clayer"))))))

;;; HERE'S WHERE I GET LOST. HOW DO I GATHER ALL THIS UP AND
;;; CREATE A SINGLE POLYLINE, OR EVEN SHOVE IT INTO A BLOCK
;;; ANY WAY SO I CAN DO THINGS WITH IT AS A SINGLE OBJECT....

(princ)
); end DrawAngleSection


(defun Arc (cen rad sAng eAng)
(entmakex (list (cons 0 "ARC")
               (cons 10cen)
               (cons 40rad)
               (cons 50 sAng)
               (cons 51 eAng))))

(defun dtr ( deg ) (* pi (/ deg 180.0)))

 
顺便提一下我仍然有工作要做,因为它不适合不等边的角度。

Stefan BMR 发表于 2022-7-5 17:56:17

在(setq x(ssgetfirst…)之后添加此行。。。。
要固定不相等的角度,第二行中的最后一点应为
(polar (polar (polar pt 0 l1) a270 l2) 0.0 -0.0625),第二条弧的中心点应为
当然,你总是可以走entmake路线
(defun DrawAngleSection ( pt l1 l2 angThk)
(entmakex
   (list
   '(0 . "LWPOLYLINE")
   '(8 . "Angles")
   '(100 . "AcDbEntity")
   '(100 . "AcDbPolyline")
   '( 90 . 9)
   '( 70 . 1)
   (list 10 0.0 0.0)
   (list 10 0.0 (* -0.4 angThk))
   (cons 42 (- (sqrt 2.0) 1))
   (list 10 (* 0.6 angThk) (- angThk))
   (list 10 (- l1 (* 2.2 angThk)) (- angThk))
   (cons 42 (- 1 (sqrt 2.0)))
   (list 10 (- l1 angThk) (* -2.2 angThk))
   (list 10 (- l1 angThk) (- (* 0.6 angThk) l2))
   (cons 42 (- (sqrt 2.0) 1))
   (list 10 (- l1 (* 0.4 angThk)) (- l2))
   (list 10 l1 (- l2))
   (list 10 l1 0.0)
   )
   )
(command-s "_move" (entlast) "" "_non" '(0 0 0) "_non" pt)
(sssetfirst nil (ssadd (entlast) (ssadd)))
)

Bill Tillman 发表于 2022-7-5 17:58:22

谢谢Stefan,实际上我解决了腿不等长的问题。但当我试用entmakex函数时,我到家了。这是千载难逢的需要。我们通常使用一个真正的钢形LISP来做这个东西,但由于是全自动的,我没有那个奢侈。entmakex例程工作正常。

Stefan BMR 发表于 2022-7-5 18:01:22

听到这个我很高兴。无论如何,我的Pedit样本是错误的。。。我将更新我的firs replay。

BIGAL 发表于 2022-7-5 18:06:00

也许有一种不同的方法可以使第一个对象成为pline,然后当你添加直线和圆弧时,使用这个(setq objs(cons(entlast)objs))来创建一个对象名称列表,你可以使用Pedit将它们连接起来。

Bill Tillman 发表于 2022-7-5 18:08:27

嘿,比格尔,谢谢你的来电。这是AutoCAD最酷的地方之一,它总是有多种方式。但在这里,我想快速解释一下Stefan BMR发布的entmakex方法。我一次只看一行,大部分都懂了。但我唯一能理解的是突起部分。。。明天早上我会详细阅读这些内容。或者在你的星球上,夜晚。。。!

Bill Tillman 发表于 2022-7-5 18:12:40

好的,现在我看了更多,我看到在一个列表中有一些顶点,可以很容易地绘制另一个适合轮廓的对象。我想要的是顶点#3、#4、#5和#6。

BIGAL 发表于 2022-7-5 18:14:04

一些pline代码
 

; 90 mm 25 arc's with straights
(command "pLINE"p2 "w" 0.0 0.0)
(setq m 0)
(while (< m N)
(setq p3 (polar p2 ang1 d2))
(setq p4 (polar p3 ang1 d2))
(setq p5 (polar (polar p3 ang1 20)(+ ang1 4.71239) d3))
(setq p6 (polar p5 ang1 d2 ))
(setq p7 (polar p6 ang1 d2))
(setq p8 (polar p4ang1 d4))
(command "a" "ce" p3 "a" "-180" "l" p5 "a" "ce" p6 p7 "l" p8)
; parallel lines now drawn
(setq m (+ 1 m))
(setq p2 p8)
)
(command "")   
; ends pline

Stefan BMR 发表于 2022-7-5 18:17:15

嗨,比尔。
来自autocad参考
在你的例子中,角度是a=90度,a/4=22.5,tan(22.5)=sqrt(2)-1。对于顺时针圆弧,凸出值为负值,因此-(sqrt(2)-1)=1-sqrt(2)。

Bill Tillman 发表于 2022-7-5 18:21:21

我最终捕获了我需要的点,如下所示:
(setq temp (vlax-get (vlax-ename->vla-object (entlast)) 'Coordinates)
   sp1 (list (nth 8 temp) (nth 9 temp))
   sp2 (list (nth 6 temp) (nth 7 temp))
   )
页: [1] 2
查看完整版本: 如何连接直线和圆弧Int