trmg 发表于 2022-7-6 08:19:10

绘制线条的Lisp

大家好!我想要一些帮助与lisp绘制线从多个起点到多个终点。
 
如果直线不相交,并且以45个角度绘制直线,这将是有益的。
 
我会附上一个我想要的绘图示例。
 
我以前从未Lisp程序,所以我不知道这有多难。我知道一些脚本(自动热键)。
 
很高兴找到这个论坛。希望你能帮助我/指导我。
 
我愿意学习。
 
致以最诚挚的问候/T
实例图纸
实例图纸

BIGAL 发表于 2022-7-6 08:23:38

你想要一个折线lisp其他人可能会想出一个更好的主意,我会选择开始点,选择一个大约水平的中点,然后结束点,这是一个足够,然后画一条线。您需要计算水平线与45线的交点,然后计算基本线pt1 pt2 pt3。你需要在4个象限内工作,因此你的45度方向正确,你需要计算出2条假想线,一条在45度,另一条在0度,然后你可以使用命令“inters”来计算中间连接点。
 
 
这并不难,但如果你从未做过Lisp程序。继续看这个帖子,现在有点忙,但其他人可能会帮上忙。
 

(setq pt1 (getpoint))
(setq pt2 (getpoint))
(setq pt3 (getpoint))
(setq ang (angle pt1p2))
(cond
(angle 0-1.5706 qaud 1) 45
(angle 1.5707-3.1416 quad2)315
(angle 3.1417-4.7123 quad 3)225
(angle 4.712371-6.283185 quad4)135
after cond can now work out inters
)

trmg 发表于 2022-7-6 08:26:24

你发布的脚本将如何触发?我是说我用什么钥匙?

BIGAL 发表于 2022-7-6 08:31:05

试试这个
 
; lisp to draw hor lines plus 45's between 2 points
; By BIGAL Jan 2012
(defun c:horbend ()
(setq pt1 (getpoint "\npick 1st point on terminal bar"))
(setq pt2 (getpoint "\npick 2nd point "))
; ang2 is horiz lines ang3 is 45 lines
(setq ang1 (angle pt1 pt2))
(cond
((> ang1 4.412388)(setq ang2 0.0)(setq ang3 (* 0.75 pi)))
((> ang1 pi)(setq ang2 pi)(setq ang3 (* 0.25 pi)))
((> ang1 (/ pi 2.0))(setq ang2 PI)(setq ang3 (* 0.75 pi)))
((> ang1 0.0)(setq ang2 0.0)(setq ang3 (* 0.25 pi)))
)
(setq pt3 (polar pt1 ang2 20.0))
(setq pt4 (polar pt2 ang3 20.0))
(setq pt5 (inters pt1 pt3 pt2 pt4 nil))
(command "line" pt1 pt5 pt2 "")
)
(princ)

trmg 发表于 2022-7-6 08:33:43

非常感谢。当我从侧面做的时候,它就起作用了。似乎不起作用的是,如果我想向上/向下画一些东西。
 
 
http://dl.dropbox.com/u/45010560/AutoCAD%20MEP%202010%20-%20%5图纸1。图纸%5D_2012-01-23_07-48-57。jpg
 
 
是否可以选择多个起点和多个终点?
 
谢谢你抽出时间。

fixo 发表于 2022-7-6 08:38:27

也试试这个,主要是从上面的代码中借用的

(defun C:HORBEND(/ acsp adoc allset ang cr cs_lst da en end_lst i ip p1 p2 p3 pt sset ta tmp tp)
; credits to BIGAL
;local defuns

; Convert value in radians to degrees
(defun rtd (a)
(* 180.0 (/ a pi))
)

(prompt "\n\t Select number of circles within the terminal port: ")
(if (setq sset (ssget '((0 . "circle") (40 . 100.0))))
(progn
(setq cs_lst nil
end_lst nil
)
(or adoc (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
(or acsp (setq acsp (vla-get-block (vla-get-activelayout adoc))))
(while
(setq en (ssname sset 0))
(setq pt (reverse (cdr (reverse (cdr (assoc 10 (entget en))))))
tmp (list pt en)
cs_lst (cons tmp cs_lst)
)
(ssdel en sset)
)
(setq cs_lst (vl-sort cs_lst '(lambda (a b) (> (cadar a) (cadar b)))))

(prompt "\n\t Select circles to connect to selected just at one side: ")

(setq allset (ssget '((0 . "circle") (40 . 100.0))))
(foreach item cs_lst
(ssdel (cadr item)
allset
)
)

(while
(setq cr (ssname allset 0))
(setq pt (reverse (cdr (reverse (cdr (assoc 10 (entget cr))))))
tmp (list pt cr)
end_lst (cons tmp end_lst)
)
(ssdel cr allset)
)
(if (/= (length cs_lst) (length end_lst))
(progn
(alert "Different numbers of start and and points")
(exit)
(princ)
)
)
(setq end_lst (vl-sort end_lst '(lambda (a b) (> (cadar a) (cadar b)))))
(setq i 0)
(repeat (length cs_lst)
(setq p1 (car (nth i cs_lst))
p3 (car (nth i end_lst))
p2 (list (car p3) (cadr p1))
ang (angle p3 p1)
da (rtd ang)
ta
(cond ((< 0. da 90.)
(/ pi 4))
((< 90. da 180.)
(* 0.75 pi))
((< 180. da 270.)
(* pi 1.25))
((< 270. da 360.)
(* pi 1.75))
)
tp (polar p3 ta (* 2 (getvar 'viewsize)))
ip (inters p1 p2 p3 tp nil)
)
(vlax-invoke acsp 'addlightweightpolyline (apply 'append (list p1 ip p3)))
(setq i (1+ i))
)
)
)
(princ)
)
(prompt "\n   ---   Start command with HORBEND   ---")
(prin1)
(or (vl-load-com) )
(princ)

 
~'J'~

trmg 发表于 2022-7-6 08:42:58

谢谢你抽出时间。我不知道怎么用那个?它说当我标记圆时找到0。

fixo 发表于 2022-7-6 08:44:47

我用了你的附图做测试

trmg 发表于 2022-7-6 08:48:50

哦,当我使用这个例子时,它是有效的。也许圆直径很重要?我在哪里换?
 
还有,我如何使它也垂直工作?还是不可能?

fixo 发表于 2022-7-6 08:51:19

(setq sset(ssget’((0。“圆”)(40.100.0)))
100.0是半径,根据需要更改
 
对于垂直,您必须创建单独的lisp,
否则代码会太复杂,
我有点忙,对不起
页: [1] 2
查看完整版本: 绘制线条的Lisp