eric_monceaux 发表于 2022-7-6 12:23:50

口齿不清分到一定长度

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

SteveK 发表于 2022-7-6 12:28:49

我无法管理动态位,但关于您的第一个请求,像这样?(红色我已经注释掉了,蓝色是我添加的)如果不是你想要的,你可以用蓝色调整公式(如果你不知道怎么问)。
 
;;StoneSegments for Stone by www.CADTutor.com with help from Eric Monceaux
;;pick 2 points & it draws mortar joints
;;suitable for vertical sides only
;;For North American Stone Company
(defun c:ss (/ dxf tmp del ent elst #len startpt endpt ang #seglen pt p1 p2 clayer a90 slst
            )
;;Set current or Create
(defun layersetcurrent (layername layercolor)
   ;;expects var LayerColor
   (or layercolor (setq layercolor 7))
   (if (tblsearch "Layer" layername)
   (command "._layer" "_thaw" layername "_on" layername "_unlock" layername "_set" layername ""
             ) ;_ closes command
   (command "._layer" "_make" layername "_color" layercolor layername ""
             ) ;_ closes command
   )
)

(defun dxf (code lst)
   (cdr (assoc code lst))
)
;;Make 2D point from 3D point
(defun 3dp->2dp (3dpt) (list (car 3dpt) (cadr 3dpt)))

(or #seg (setq #seg 4))
(setq #gap 0.25)
(or #mlen (setq #mlen 6))

;;;(initget 6) ; No null, negative, zero
;;;(setq tmp (getint (strcat "\nEnter the number of segments.<" (itoa #seg) ">")))
;;;(setq #seg (if tmp tmp #seg))
(initget 6) ; No null, negative, zero
(setq tmp (getdist (strcat "\nEnter width of surround.<" (rtos #mlen) ">")))
(setq #mlen (if tmp tmp #mlen))
(setq p1 (getpoint "\nPick bottom of longest side."))
(setq p2 (getpoint p1 "\nPick top of longest side."))
(if (and p1 p2)
   (progn
   (if (> (setq #len (distance p1 p2)) 36.) ; 36" ~ 0.9144
   (if (= (fix (setq #seg (/ #len 36.))) #seg)
   (setq #seg (fix #seg))
   (setq #seg (fix (1+ #seg)))
   )
   )
   (setq #seglen (/ (- #len (- (* #seg #gap) #gap)) #seg))
   (if (minusp #seglen)
       (alert "Line is too short.")
       (progn
         (setq clayer (getvar "clayer")
               ang    (angle p1 p2)
               pt   (polar p1 ang #seglen)
               a90    (+ ang (/ pi 2))
         )
         (layersetcurrent "Mortar" 2)
         (setq slst (ssadd))
         (repeat (- #seg 1)
         (command "._Line" "_non" pt "_non" (polar pt a90 #mlen) "")
         (setq slst (ssadd (entlast) slst))
         (command "._Line" "_non" (setq pt (polar pt ang #gap)) "_non" (polar pt a90 #mlen) "" )
         (setq slst (ssadd (entlast) slst))
         (setq pt (polar pt ang #seglen))
         )
         (setvar "clayer" clayer)
         (initget "Yes No")
         (setq ans (getkword "Flip Lines? <No> "))
         (if (= ans "Yes")
         (command ".mirror" slst "" "non" p1 "non" p2 "Y")
         )

       )
   )


   )
)
(princ)
)
(prompt "\nStone Segments Loaded, enter ss to run. For North American Stone Company")
(princ)

eric_monceaux 发表于 2022-7-6 12:36:13

这绝对是正确的方向。然而,当我执行该命令时,我将其应用于一条10'-0“长的线,并将其分成30段@3-3/4”。我需要将每个工件的尺寸改为不大于36“,就像点x到y的距离大于36“,然后除以。
 
我希望这有帮助。

SteveK 发表于 2022-7-6 12:39:29

我编辑了我之前的帖子,加入了一个if distance>36的语句。怎么样?

SteveK 发表于 2022-7-6 12:44:37

对不起,我花了一点时间才拿到&我不习惯英制尺寸。无论如何,我已经再次更新了代码。

eric_monceaux 发表于 2022-7-6 12:51:31

我应用了这些更改,并在3.048m线上再次调用该命令,它在20.6375mm处分为100多个部分。从我对LISP的了解来看,您添加的内容似乎是正确的。
 
顺便说一句,我真的很感谢你的帮助。

SteveK 发表于 2022-7-6 12:52:12

好的,很高兴它似乎起作用了。
 
如果这不太正确,我认为最好的办法是忽略lisp,试着计算出一个公式,它将如何计算截面,然后一旦做了,你可以试试,或者我可以把它插入lisp为你。因为我可能仍在努力解决它的数学问题。。。

eric_monceaux 发表于 2022-7-6 12:56:27

我完全理解。。。。下面是这个过程是如何在计算器上进行的。
 
(AUTOCAD)DIST,选择A,然后选择B
我们将以120为例(A到B=120)
=然后除以(120/36=3.3333333)
=现在取实数(3*0.25=0.75)
=从A、B中减去该值(120-0.75=119.25)
 
然后将E除以上限C
 
这将使最终的除法输出由间隔0.25的两行分隔。
 
希望这有帮助!

SteveK 发表于 2022-7-6 13:04:03

这确实有帮助(至少让我们走上正轨)
 
大家知道我在做什么,这是用lisp格式得到的组合公式:
,,
我想检查的是,当你计算这个值时,当程序要求你“输入段数”时,你会输入它吗?在这种情况下,它是一个实数,您希望它是一个整数?所以我在lisp(更新后的帖子)中将其舍入为一个整数。

eric_monceaux 发表于 2022-7-6 13:08:26

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