samifox 发表于 2022-7-6 06:47:25

我的第一个Autolisp项目:Co

你好
 
我非常激动地宣布我的第一个项目在Autolisp。我知道的比我能咀嚼的多得多,但我兴奋的原因是,这个程序可以节省我在日常工作中的时间,甚至几天。
 
我试着尽可能地让人容易理解。我用通俗易懂的英语编写命令,绘制并注释所有步骤,甚至发布流程图。
 
项目概述:
 
将墙的总长度除以x段数(限制为每个段的最小长度和最大长度的结果(感谢marko))。
 
 
 
该程序只需检查正面和背面标高之间的距离,并绘制一面墙(地面上)和一面底墙(地下)
 
 
而不是绘制一个从最低点到墙(形成墙)的矩形,然后根据前后立面之间的距离绘制基础墙。
 
欢迎任何想法!

samifox 发表于 2022-7-6 07:01:28

你好
我写了以下代码:

;** 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
我希望它能保持距离,
为什么会这样?
 
谢谢
谢伊

BIGAL 发表于 2022-7-6 07:05:50

如果您不使用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))
)

samifox 发表于 2022-7-6 07:14:13

你好
 
我简化了代码的结构:
 
我应该始终使用局部变量吗?如果另一个函数需要先前计算的变量的值,该怎么办?
 
谢谢
谢伊

fixo 发表于 2022-7-6 07:29:59

您必须收集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))

BIGAL 发表于 2022-7-6 07:31:27

也许可以这样改变你的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)
)

samifox 发表于 2022-7-6 07:43:18

谢谢BIGAL和fixo。当我让主要功能工作时,我会记住这一点。现在仍然有问题,
 
简单地说,到目前为止,我从用户那里得到了总长度,然后将其除以(由marko_ribar编写的原始代码),所以现在我知道了我有多少段,以及每个段的长度。
 
下一步是询问用户哪条线代表墙,哪条线代表正面、背面和现有立面(不确定如何存储它们)
 
然后,我想用“段长度”间隔沿每条线分布顶点,并找到每个段中的最低y坐标(pBe编写的原始代码)
 
 
 
 
 
我对两件事感到困惑:
[列表=1]
[*]我应该如何将多段线名称(后、前等)与其对应的坐标列表绑定?
[*]如何沿总长度每隔4点获得最低y坐标?
这是我在这个伟大团队成员的帮助下编辑的不可中断代码,希望在不久的将来成为可中断代码
9
 
 
 
谢谢
谢伊

BIGAL 发表于 2022-7-6 07:55:30

几点建议
 
您只需要在代码的最开始第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]
查看完整版本: 我的第一个Autolisp项目:Co