乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 95|回复: 13

[编程交流] Lisp程序分到一定长度

[复制链接]

12

主题

48

帖子

40

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 12:23:50 | 显示全部楼层 |阅读模式
我想看看我附加的Lisp程序是否可以做更多的事情。
 
目前它所做的是分割一条线,并将垂直线放置在1/4”的距离处。我在一家石材公司工作,在绘制石窗周围时,必须将其分割成多个部分(如果超过36”),并以1/4”的间距隔开,以便涂抹砂浆。
 
我希望它能够自动分割线(同时仍然能够给出输出线的长度),而不需要用户输入。
 
另外,作为一种旁注,有可能制作一个动态版本吗?最终目标将能够将窗口作为动态块插入,当您将其拉伸到提供的尺寸时,关节将自动调整为永远不超过36英寸?
石头段。LSP
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:28:49 | 显示全部楼层
我无法管理动态位,但关于您的第一个请求,像这样?(红色我已经注释掉了,蓝色是我添加的)如果不是你想要的,你可以用蓝色调整公式(如果你不知道怎么问)。
 
  1. ;;  StoneSegments for Stone by www.CADTutor.com with help from Eric Monceaux
  2. ;;  pick 2 points & it draws mortar joints
  3. ;;  suitable for vertical sides only
  4. ;;  For North American Stone Company
  5. (defun c:ss (/ dxf tmp del ent elst #len startpt endpt ang #seglen pt p1 p2 clayer a90 slst
  6.             )
  7. ;;  Set current or Create
  8. (defun layersetcurrent (layername layercolor)
  9.    ;;  expects var LayerColor
  10.    (or layercolor (setq layercolor 7))
  11.    (if (tblsearch "Layer" layername)
  12.      (command "._layer" "_thaw" layername "_on" layername "_unlock" layername "_set" layername ""
  13.              ) ;_ closes command
  14.      (command "._layer" "_make" layername "_color" layercolor layername ""
  15.              ) ;_ closes command
  16.    )
  17. )
  18. (defun dxf (code lst)
  19.    (cdr (assoc code lst))
  20. )
  21. ;;Make 2D point from 3D point
  22. (defun 3dp->2dp (3dpt) (list (car 3dpt) (cadr 3dpt)))
  23. (or #seg (setq #seg 4))
  24. (setq #gap 0.25)
  25. (or #mlen (setq #mlen 6))
  26. [color=Red];;;  (initget 6) ; No null, negative, zero
  27. ;;;  (setq tmp (getint (strcat "\nEnter the number of segments.<" (itoa #seg) ">")))
  28. ;;;  (setq #seg (if tmp tmp #seg))[/color]
  29. (initget 6) ; No null, negative, zero
  30. (setq tmp (getdist (strcat "\nEnter width of surround.<" (rtos #mlen) ">")))
  31. (setq #mlen (if tmp tmp #mlen))
  32. (setq p1 (getpoint "\nPick bottom of longest side."))
  33. (setq p2 (getpoint p1 "\nPick top of longest side."))
  34. (if (and p1 p2)
  35.    (progn
  36. [color=Blue]     (if (> (setq #len (distance p1 p2)) 36.) ; 36" ~ 0.9144
  37.    (if (= (fix (setq #seg (/ #len 36.))) #seg)
  38.      (setq #seg (fix #seg))
  39.      (setq #seg (fix (1+ #seg)))
  40.      )
  41.    )[/color]
  42.      (setq #seglen (/ (- #len (- (* #seg #gap) #gap)) #seg))
  43.      (if (minusp #seglen)
  44.        (alert "Line is too short.")
  45.        (progn
  46.          (setq clayer (getvar "clayer")
  47.                ang    (angle p1 p2)
  48.                pt     (polar p1 ang #seglen)
  49.                a90    (+ ang (/ pi 2))
  50.          )
  51.          (layersetcurrent "Mortar" 2)
  52.          (setq slst (ssadd))
  53.          (repeat (- #seg 1)
  54.            (command "._Line" "_non" pt "_non" (polar pt a90 #mlen) "")
  55.            (setq slst (ssadd (entlast) slst))
  56.            (command "._Line" "_non" (setq pt (polar pt ang #gap)) "_non" (polar pt a90 #mlen) "" )
  57.            (setq slst (ssadd (entlast) slst))
  58.            (setq pt (polar pt ang #seglen))
  59.          )
  60.          (setvar "clayer" clayer)
  61.          (initget "Yes No")
  62.          (setq ans (getkword "Flip Lines? <No> "))
  63.          (if (= ans "Yes")
  64.            (command ".mirror" slst "" "non" p1 "non" p2 "Y")
  65.          )
  66.        )
  67.      )
  68.    )
  69. )
  70. (princ)
  71. )
  72. (prompt "\nStone Segments Loaded, enter ss to run. For North American Stone Company")
  73. (princ)
回复

使用道具 举报

12

主题

48

帖子

40

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 12:36:13 | 显示全部楼层
这绝对是正确的方向。然而,当我执行该命令时,我将其应用于一条10'-0“长的线,并将其分成30段@3-3/4”。我需要将每个工件的尺寸改为不大于36“,就像点x到y的距离大于36“,然后除以。
 
我希望这有帮助。
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:39:29 | 显示全部楼层
我编辑了我之前的帖子,加入了一个if distance>36的语句。怎么样?
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:44:37 | 显示全部楼层
对不起,我花了一点时间才拿到&我不习惯英制尺寸。无论如何,我已经再次更新了代码。
回复

使用道具 举报

12

主题

48

帖子

40

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 12:51:31 | 显示全部楼层
我应用了这些更改,并在3.048m线上再次调用该命令,它在20.6375mm处分为100多个部分。从我对LISP的了解来看,您添加的内容似乎是正确的。
 
顺便说一句,我真的很感谢你的帮助。
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:52:12 | 显示全部楼层
好的,很高兴它似乎起作用了。
 
如果这不太正确,我认为最好的办法是忽略lisp,试着计算出一个公式,它将如何计算截面,然后一旦做了,你可以试试,或者我可以把它插入lisp为你。因为我可能仍在努力解决它的数学问题。。。
回复

使用道具 举报

12

主题

48

帖子

40

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 12:56:27 | 显示全部楼层
我完全理解。。。。下面是这个过程是如何在计算器上进行的。
 
(AUTOCAD)DIST,选择A,然后选择B
我们将以120为例(A到B=120)
[C] =然后除以(120/36=3.3333333)
[D] =现在取实数(3*0.25=0.75)
[E] =从A、B中减去该值(120-0.75=119.25)
 
然后将E除以上限C
 
这将使最终的除法输出由间隔0.25的两行分隔。
 
希望这有帮助!
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 13:04:03 | 显示全部楼层
这确实有帮助(至少让我们走上正轨)
 
大家知道我在做什么,这是用lisp格式得到的组合公式:
[C] ,[D],[E]
我想检查的是,当你计算这个值时,当程序要求你“输入段数”时,你会输入它吗?在这种情况下,它是一个实数,您希望它是一个整数?所以我在lisp(更新后的帖子)中将其舍入为一个整数。
回复

使用道具 举报

12

主题

48

帖子

40

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 13:08:26 | 显示全部楼层
是的,你是对的。“输入段数”是[C]的输出。实际上,我想要实现的是将这个整数自动化。为了让大家了解这个程序的使用背景,让我解释一下它的用途。
 
我在一家建筑铸石公司工作,我们生产用于住宅和商业建筑的砖石制品。这个程序有助于在一个过程中,我用手动或QBASIC。。。是QBASIC。当我画窗围时,例如(包括在上传的图纸中),支腿和标题件的长度不能超过36“由于我们制作石膏模具的长度,或者负片。因此,我会绘制窗口环绕,以十进制单位获得腿部或头部的距离,将该量输入QBASIC,QBASIC知道将整数除以36,然后显示除法输出,我会将显示的数字输入到程序的下一部分,它会给出我的偏移距离. 我仍然需要在输出整数之间手动偏移关节(LISP的0.25部分)。
 
重要的是要记住,如果[C]大于一个整数,它需要总是向上取整,而不是向下取整。例如,在EXCEL中,它看起来像:
单元格A1[3.333333]
单元格B1[=天花板(A1,1)],A1为数字,1为显著性。
 
关于你所做的改变。我上传了一个dwg,显示发生了什么,需要发生什么。
 
此外,我要再次感谢你的帮助。希望有一天我能成为那个回答问题的人。
输出图纸
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 06:03 , Processed in 0.459046 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表