autocad - 运行 AutoLISP 文件的脚本
问题描述
我想使用这个 lisp 文件绘制大约 1000 个带有切线的圆的形状,该文件一次绘制一个形状。
我编写了一个脚本来绘制所有形状(见下文),但是它在第一个参数之后等待下一个参数,尽管它在脚本中。
您能否指导我如何修复我的脚本或如何编辑 lisp 文件,以便我可以在没有交互式输入的情况下绘制所有形状?
这是我当前的脚本:
ctan
0,0,0
5
0,10,0
10
解决方案
问题是 Script 和 AutoLISP 函数的评估发生在同一个处理器线程中,因此当您从 Script 文件中评估 AutoLISP 函数时,AutoLISP 函数将焦点从 Script和 Script 文件的其余部分移开将在 AutoLISP 函数完成评估后进行评估。
为了解决这个问题,我建议定义一个单独的 AutoLISP 函数,它接受与每个圆的中心和半径相对应的四个参数,并以与我的Circle Tangents应用程序相同的方式构造 2D LWPolyline 。
然后,您可以从您的脚本文件(如果需要,可能在多幅图纸上)评估此类函数,或从另一个 AutoLISP 程序中评估该函数。
这样的功能可能是:
(defun ctan ( c1 r1 c2 r2 / d1 d2 a1 a2 zv )
(if (< (abs (setq d1 (- r1 r2))) (setq d2 (distance c1 c2)))
(progn
(setq a1 (atan (sqrt (- (* d2 d2) (* d1 d1))) d1)
a2 (angle c1 c2)
zv (trans '(0.0 0.0 1.0) 1 0 t)
)
(entmake
(list
'(000 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(090 . 04)
'(070 . 01)
(cons 010 (trans (polar c1 (+ a1 a2) r1) 1 zv))
(cons 042 (/ (sin (/ (- pi a1) 2.0)) (cos (/ (- pi a1) 2.0))))
(cons 010 (trans (polar c1 (- a2 a1) r1) 1 zv))
(cons 010 (trans (polar c2 (- a2 a1) r2) 1 zv))
(cons 042 (/ (sin (/ a1 2.0)) (cos (/ a1 2.0))))
(cons 010 (trans (polar c2 (+ a1 a2) r2) 1 zv))
(cons 210 zv)
)
)
)
)
)
加载后,您可以使用以下命令从您的脚本或其他 AutoLISP 程序中调用:
(ctan '(0 0 0) 5 '(0 10 0) 10)
推荐阅读
- python - 如何返回我的输出而不是打印?
- angular - Angular,2 个主题,combineLatest 不起作用
- c - C 内存对齐指针取消引用
- perl - 期待 Mojolicious 路线中的争论
- vue.js - Vue 路由器的注入在 Jest 单元测试期间失败
- android - 如何在flutter中访问和更改来自不同文件的变量
- kubernetes-pod - 在包含 k8s 中文件的现有目录上挂载卷
- amazon-ec2 - 如何从命令行启用 gnome-remote-desktop 服务?
- mysql - PHP MYSQL 和 CONCAT GROUP
- reactjs - 如何从另一个子组件调用子提交方法