tomelgato 发表于 2022-7-5 15:57:44

重复测量

大家好!
 
我在Autocad和Lisp中都不是很流畅。
 
 
我需要定期测量从给定直线到样条(多边形)曲线的距离。每个样条需要做大约100个,所以每只手做这个有点无聊。
 
现在没有找到任何解决方法,也许有人可以启发我。
 
见附图
 
 
http://blastinc.net/tm/acad1.png
 
谢谢你,汤姆

Grrr 发表于 2022-7-5 16:02:40

您是否使用:
[列表]
[*]尺寸之间的固定距离
[*]固定数量的尺寸
[/列表]
 
第二种选择对我来说听起来不切实际(当它用于项目执行时)。

tomelgato 发表于 2022-7-5 16:05:03

测量线始终与基准线呈90度角(示例中的红色或绿色)。
 
尺寸之间的距离始终相同(如100mm)。
 
谢谢

tomelgato 发表于 2022-7-5 16:10:51

P、 S.测量的起点是基线的起点。然后每隔X mm,直到基线结束。我还可以提供更多数据,如X=距离,Z=测量数量
 
汤姆

tomelgato 发表于 2022-7-5 16:12:16

更新了草图以使其更清晰

Roy_043 发表于 2022-7-5 16:15:51

下面的代码假设图形是二维的(在WCS中),基线是水平的。
(defun KGA_List_Divide_3 (lst / ret)
(repeat (/ (length lst) 3)
   (setq ret (cons (list (car lst) (cadr lst) (caddr lst)) ret))
   (setq lst (cdddr lst))
)
(reverse ret)
)

(defun KGA_Sys_ObjectOwner (obj)
(vla-objectidtoobject (vla-get-database obj) (vla-get-ownerid obj))
)

(defun DimCurveAtPoint (curve pt / space tmp)
(setq space (KGA_Sys_ObjectOwner curve))
(setq tmp (vlax-invoke space 'addxline pt (mapcar '+ '(0.0 1.0 0.0) pt)))
(foreach int (KGA_List_Divide_3 (vlax-invoke curve 'intersectwith tmp acextendnone))
   (vlax-invoke space 'adddimaligned pt int pt)
)
(vla-delete tmp)
)

(defun c:DimCurve ( / baseEntselLst basePtLst curve dist doc pt vec)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-endundomark doc)
(vla-startundomark doc)
(if
   (and
   (setq curve (car (entsel "\nSelect curve: ")))
   (setq baseEntselLst (entsel "\nSelect base line near start point: "))
   (setq dist (getdist "\nDistance between dimensions: "))
   )
   (progn
   (setq pt (cadr baseEntselLst))
   (setq basePtLst
       (list
         (vlax-curve-getstartpoint (car baseEntselLst))
         (vlax-curve-getendpoint (car baseEntselLst))
       )
   )
   (if (> (distance pt (car basePtLst)) (distance pt (cadr basePtLst)))
       (setq basePtLst (reverse basePtLst))
   )
   (setq curve (vlax-ename->vla-object curve))
   (setq pt (car basePtLst))
   (setq vec
       (list
         (if (> (caar basePtLst) (caadr basePtLst)) (- dist) dist)
         0.0
         0.0
       )
   )
   (repeat (fix (/ (apply 'distance basePtLst) dist))
       (DimCurveAtPoint curve pt)
       (setq pt (mapcar '+ pt vec))
   )
   )
)
(vla-endundomark doc)
(princ)
)

tomelgato 发表于 2022-7-5 16:20:13

谢谢你,罗伊!
 
无法运行代码。我必须删除以下几行,否则我将不会被要求提供参数。就像这样。。它不起作用
 
;(setq doc(vla get activedocument(vlax get acad object)))
;(vla ENDUDOMARK文件)
;(vla startundomark文件)
 
我错过了什么?Im使用ACad 2017 Mac。
 
谢谢-汤姆

tomelgato 发表于 2022-7-5 16:24:28

嗯,似乎在非windows平台上不支持ALisp中的ActiveX命令。我不知道还有一个不同的命令集。纯Lisp的东西正在工作。。直到现在

Grrr 发表于 2022-7-5 16:25:15

 
没有ActiveX?-听起来很有趣
 
然而,仍然可以编写一个适用于具有直线段的多段线的解决方案(即使有凸起-如果有人已经有了计算圆弧/凸起和直线之间交点的子函数)。
因此,您需要重新考虑使用多段线或至少将该样条线转换为一条。

tomelgato 发表于 2022-7-5 16:30:53

嗯,我不确定。我发现一个Autodesk文档,其中说明ActiveX在非Windows平台上不存在。
 
https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-AutoLISP/files/GUID-FC6FC3E3-ED3E-4E4D-9766-8E4D037241A5-htm.html
 
AutoCAD对象是以层次方式构造的,应用程序对象位于根。
 
注意:AutoLISP中的ActiveX支持仅限于Windows。
 
 
另一方面,实际文件的状态不同:
 
https://knowledge.autodesk.com/support/autocad-for-mac/learn-explore/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-MAC-Core/files/GUID-BC26675C-A124-4612-81AB-3087AE06F5AC-htm.html
 
创建实体的最新方法是使用VLISP中的ActiveX函数。ActiveX与entmake和command相比有几个优点。
 
六羟甲基三聚氰胺六甲醚。。。。
页: [1] 2
查看完整版本: 重复测量