mbdoyle 发表于 2022-7-6 11:32:15

三角形延长

大家好,由于我对autolisp还很陌生,我想知道是否有人可以快速向我展示一种方法来执行以下操作:
 
运行lisp或宏,允许我拾取一组线,然后输入一个距离,并将这些线的两侧延长该距离。
 
我猜这对很多人来说都不是什么挑战,因为我在这些论坛上看到了一些令人印象深刻的代码
 
谢谢
马特

alanjt 发表于 2022-7-6 11:47:27

也许是这样的。。。
(defun c:TEst (/ #SS #Dist)
(vl-load-com)
(and (setq #SS (ssget "_:L" '((0 . "LINE,LWPOLYLINE"))))
      (setq #Dist (getdist "\nSpecify length: "))
      (foreach x (vl-remove-if 'listp (mapcar 'cadr (ssnamex #SS)))
      (vl-cmdf "_.lengthen"
               "_delta"
               #Dist
               (list x (vlax-curve-getendpoint x))
               (list x (vlax-curve-getstartpoint x))
               ""
      ) ;_ vl-cmdf
      ) ;_ foreach
) ;_ and
(princ)
) ;_ defun

mbdoyle 发表于 2022-7-6 11:56:06

这很好用,非常感谢alanjt!
 
马特

alanjt 发表于 2022-7-6 12:09:17

 
没问题。我不是一个给你鱼,但对于这样一个简单的问题,它只是更好地从常规开始。一定要看一遍,这样你才能理解它;我不介意回答问题。

mbdoyle 发表于 2022-7-6 12:12:33

所以我一直在看这个lisp的代码,我在vlisp上遇到了一些问题@以下几行:
 
 
1: (foreach x(vl remove if“listp(mapcar)”cadr(ssnamex#SS)))
 
2: (列表x(vlax curve getendpoint x))
 
3: (列表x(vlax曲线getstartpoint x))
 
也许我可以得到一些澄清?尤其是第一行。非常感谢你。
 
马特

alanjt 发表于 2022-7-6 12:30:10

对于问题1:
[列表]
[*]ssnamex返回选择集中每个实体的创建方式。在此列表中,所有实体都位于子列表中。
[*]mapcar遍历给定列表,对每个项目执行特定功能,并返回一个新处理的列表。
[*]cadr提取列表中的第二项。(mapcar的cadr#List)将提取#List内每个子列表中的第二项
[*]vl remove if“listp将从新进程列表中删除LST(列表)类型的所有对象。
通过执行此操作,我可以创建一个仅包含提取的名称(实体)的列表,从那里我可以逐步浏览列表并执行我需要的任何操作。您还可以使用while或repeat和ssname单步遍历选择集。这甚至有点快,但在这一刻,我想用上述方法(不止一种方法去剥猫皮)。

alanjt 发表于 2022-7-6 12:33:38

问题2和3:
[列表]
[*]Lengthen和许多其他类似功能在选择对象时,除了ename(实体)外,还需要/使用一个点,以正确了解用户选择的实体上的位置
[*]我所做的是提取所选行的端点和起点,并将其与ename结合以馈送到lenghten。这确保了我可以延长这两条线。
类似地,将一个ename馈送到一个函数,如果没有提供一个点,很多时候你会收到不同的结果-这并不适用于所有命令函数。
 
例如:
;;; without point
(defun c:Test (/ e)
(and (setq e (entsel "\nSelect line: "))
      (command "_.lengthen" "_delta" 10. (car e) "")))

;;; with point
(defun c:Test (/ e)
(and (setq e (entsel "\nSelect line: "))
      (command "_.lengthen" "_delta" 10. e "")))
 
您会注意到,使用第一个函数(无点),有时可能会在选择线的另一端延伸。
页: [1]
查看完整版本: 三角形延长