我的第一个Autolisp项目:Co
你好我非常激动地宣布我的第一个项目在Autolisp。我知道的比我能咀嚼的多得多,但我兴奋的原因是,这个程序可以节省我在日常工作中的时间,甚至几天。
我试着尽可能地让人容易理解。我用通俗易懂的英语编写命令,绘制并注释所有步骤,甚至发布流程图。
项目概述:
将墙的总长度除以x段数(限制为每个段的最小长度和最大长度的结果(感谢marko))。
该程序只需检查正面和背面标高之间的距离,并绘制一面墙(地面上)和一面底墙(地下)
而不是绘制一个从最低点到墙(形成墙)的矩形,然后根据前后立面之间的距离绘制基础墙。
欢迎任何想法!
你好
我写了以下代码:
;** get user information **;
;get the start and end points, total length
(defun c:main ( / strPt endPt totLng)
(setq strPt (getpoint "\nStart point of line : "))
(setq endPt (getpoint strPt "\nEnd point of line : "))
(setq strPt (trans strPt 1 0) endPt (trans endPt 1 0))
(setq totLng (distance strPt endPt))
)
这是我在计时点后得到的输出:
线路起点:
线路终点:400.0
(我不明白400是从哪里来的)
当我打字的时候!合计
我得到0
我希望它能保持距离,
为什么会这样?
谢谢
谢伊 如果您不使用ucs,则代码可以更简单,即如果您的dwg是二维的,则仅忽略trans
;get the start and end points, total length
(defun c:main ( / strPt endPt totLng)
(setq strPt (getpoint "\nStart point of line : "))
(setq endPt (getpoint strPt "\nEnd point of line : "))
(setq totLng (distance strPt endPt))
)
如果你使用ucs,但想在世界上合作,那么像这样的事情
;get the start and end points, total length
(defun c:main ( / strPt endPt totLng)
(setq strPt (trans (getpoint "\nStart point of line : ") 1 0))
(setq endPt (trans (getpoint strPt "\nEnd point of line : ") 1 0))
(setq totLng (distance strPt endPt))
) 你好
我简化了代码的结构:
我应该始终使用局部变量吗?如果另一个函数需要先前计算的变量的值,该怎么办?
谢谢
谢伊 您必须收集main_列表中的所有小计,
那么总的结果是这样的
(setq total (apply '+ main_list))
如果需要从一开始就增加距离列表
尝试此功能
;; by VovKa
(defun sumlist (lst / )
(if lst
(append (sumlist (reverse (cdr (reverse lst))))
(list (apply '+ lst)))
));if & defun
用法:
(setq runned_totals (sumlist main_list))
也许可以这样改变你的main,你的totlong不被设置为局部变量。也不需要strpt endpt,因为它们是局部变量。虽然这不是很好的编程,但从()开始,没有变量集使所有变量都是全局的,然后随着代码的进行返回并设置局部变量。也许也有一个想法,你的defun真的是做2件事,得到2个点加上距离,我会更倾向于使用它,因为2xpt,然后把距离作为一个局部声明,你可能会想要更简单的例程,比如选择3个点加上是前两个的第三个perp。在变量的使用方面,有比我更多的专家,我相信他们会有所帮助。
我一直在使用defuns,这让生活变得更加轻松。把你所有的常用defuns都放在acaddoc中。lsp则可以使用,无需在每个程序中再次编码。
(defun c:main ()
(getTwopoints)
(setq totlng (distance pt1 pt2)) ; this way you can use pt1 & pt2 again else a defun (dp1p2)
;(setq totlng (dp1p2))
)
(defun getTwopoints ( )
(setq strPt (getpoint "\nStart point : "))
(setq endPt (getpoint strPt "\nEnd point : "))
)
(defun dp1p2 (pt1 pt2 / )
(distance pt1 pt2)
)
谢谢BIGAL和fixo。当我让主要功能工作时,我会记住这一点。现在仍然有问题,
简单地说,到目前为止,我从用户那里得到了总长度,然后将其除以(由marko_ribar编写的原始代码),所以现在我知道了我有多少段,以及每个段的长度。
下一步是询问用户哪条线代表墙,哪条线代表正面、背面和现有立面(不确定如何存储它们)
然后,我想用“段长度”间隔沿每条线分布顶点,并找到每个段中的最低y坐标(pBe编写的原始代码)
我对两件事感到困惑:
[列表=1]
[*]我应该如何将多段线名称(后、前等)与其对应的坐标列表绑定?
[*]如何沿总长度每隔4点获得最低y坐标?
这是我在这个伟大团队成员的帮助下编辑的不可中断代码,希望在不久的将来成为可中断代码
9
谢谢
谢伊 几点建议
您只需要在代码的最开始第2行加载vl com。
您只需要1个get co ords defun,只需将返回值设置为新的变量名,您可能需要包括getco ords的第二部分,该部分构成一个pline点列表。
10
关于每4个点的最小值Y,只需使用(nth J frontelev)和步长J乘2列表是x Y x Y x Y,只需使用a(如果(
页:
[1]