口齿不清分到一定长度
我想看看我附加的Lisp程序是否可以做更多的事情。目前它所做的是分割一条线,并将垂直线放置在1/4”的距离处。我在一家石材公司工作,在绘制石窗周围时,必须将其分割成多个部分(如果超过36”),并以1/4”的间距隔开,以便涂抹砂浆。
我希望它能够自动分割线(同时仍然能够给出输出线的长度),而不需要用户输入。
另外,作为一种旁注,有可能制作一个动态版本吗?最终目标将能够将窗口作为动态块插入,当您将其拉伸到提供的尺寸时,关节将自动调整为永远不超过36英寸?
石头段。LSP 我无法管理动态位,但关于您的第一个请求,像这样?(红色我已经注释掉了,蓝色是我添加的)如果不是你想要的,你可以用蓝色调整公式(如果你不知道怎么问)。
;;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) 这绝对是正确的方向。然而,当我执行该命令时,我将其应用于一条10'-0“长的线,并将其分成30段@3-3/4”。我需要将每个工件的尺寸改为不大于36“,就像点x到y的距离大于36“,然后除以。
我希望这有帮助。 我编辑了我之前的帖子,加入了一个if distance>36的语句。怎么样? 对不起,我花了一点时间才拿到&我不习惯英制尺寸。无论如何,我已经再次更新了代码。 我应用了这些更改,并在3.048m线上再次调用该命令,它在20.6375mm处分为100多个部分。从我对LISP的了解来看,您添加的内容似乎是正确的。
顺便说一句,我真的很感谢你的帮助。 好的,很高兴它似乎起作用了。
如果这不太正确,我认为最好的办法是忽略lisp,试着计算出一个公式,它将如何计算截面,然后一旦做了,你可以试试,或者我可以把它插入lisp为你。因为我可能仍在努力解决它的数学问题。。。 我完全理解。。。。下面是这个过程是如何在计算器上进行的。
(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的两行分隔。
希望这有帮助! 这确实有帮助(至少让我们走上正轨)
大家知道我在做什么,这是用lisp格式得到的组合公式:
,,
我想检查的是,当你计算这个值时,当程序要求你“输入段数”时,你会输入它吗?在这种情况下,它是一个实数,您希望它是一个整数?所以我在lisp(更新后的帖子)中将其舍入为一个整数。 是的,你是对的。“输入段数”是的输出。实际上,我想要实现的是将这个整数自动化。为了让大家了解这个程序的使用背景,让我解释一下它的用途。
我在一家建筑铸石公司工作,我们生产用于住宅和商业建筑的砖石制品。这个程序有助于在一个过程中,我用手动或QBASIC。。。是QBASIC。当我画窗围时,例如(包括在上传的图纸中),支腿和标题件的长度不能超过36“由于我们制作石膏模具的长度,或者负片。因此,我会绘制窗口环绕,以十进制单位获得腿部或头部的距离,将该量输入QBASIC,QBASIC知道将整数除以36,然后显示除法输出,我会将显示的数字输入到程序的下一部分,它会给出我的偏移距离. 我仍然需要在输出整数之间手动偏移关节(LISP的0.25部分)。
重要的是要记住,如果大于一个整数,它需要总是向上取整,而不是向下取整。例如,在EXCEL中,它看起来像:
单元格A1
单元格B1[=天花板(A1,1)],A1为数字,1为显著性。
关于你所做的改变。我上传了一个dwg,显示发生了什么,需要发生什么。
此外,我要再次感谢你的帮助。希望有一天我能成为那个回答问题的人。
输出图纸
页:
[1]
2