Ohnoto 发表于 2022-7-6 09:42:30

与块插入点的距离

我正在尝试使用LISP来确定选定对象到最近直线的距离,然后将该值放入相应的属性值,称为“偏移”。
 
我有将值放入偏移属性的代码,但在如何确定块到最近直线的距离方面遇到了问题。
 
为了确定基线,我的代码是:
(defun EXAOS_CreateBaselineSet ()
   (setq exaosBaselineSet
      (ssget "_X"
          (list
         (cons 0 "ARC,CIRCLE,ELLIPSE,LINE,LWPOLYLINE,POLYLINE,SPLINE")
         (cons 8 "GPS-ROAD,BASELINE,EOG,EOP,FOGLINE,FOC")
         )))
   )
 
现在,它只是在计算如何获得从块的插入到上面基线集最近点的距离。

Lee Mac 发表于 2022-7-6 09:49:01

可能使用以下功能:
 
(defun ShortestDistanceFromPointtoSet(sset pt/i lst)(vl load com)(if sset(repeat(setq i(sslength sset))(setq lst(cons(distance pt(vlax curve getClosestPointto(ssname sset(setq i(1-i)))pt))lst))(car(vl sort lst'

Ohnoto 发表于 2022-7-6 09:56:08

谢谢李,这很有帮助。
 
但是,我在代码中遇到了一个错误,无法将值插入到我的块中,如果有人可以帮助我了解其中的位置和原因的话。
 
我选择要应用距离的块,然后选择点,得到一个错误“错误:ActiveX服务器返回错误:未知名称:名称”。
 
还有,如果我在不同的距离选择多个块,有没有办法得到它,它会根据插入点在属性中输入每个块的距离值?
纤维标记试验。图纸
EXAOS_Main-0039。LSP

Lee Mac 发表于 2022-7-6 10:02:23

选择曲线对象后,包含块的SelectionSet不再是“ActiveSelectionSet”。
 
试试这个:
 
(定义c:测试(/blocks di e i o pt s s1 s2)(vl负载com)(setq blocks’(“光纤标记管STA”)i-1)(if(和(setq s1(ssget(list’(0。“INSERT”)(cons 2(应用‘strcat(cons”`*U*“(mapcar’(lambda(s)(strcat,s))块)))))(setq s2(ssget“_X”(list(cons 0“圆弧、圆、椭圆、直线、*多段线、样条”)(cons 8“GPS-ROAD、基线、EOG、EOP、FOGLINE、FOC”)(setq pt(getpoint“\n选择点:)(setq di(ShortestDistanceFromPointtoSet s2(trans pt 1 0)))(而(setq e(ssname s1(setq i(1+i)))))(if(和(vl位置(strcase(vlax get property)(setq o(vlax ename->vla object e))(if(vlax-property-available-p o'EffectiveName'EffectiveName'Name))(blocks)(eq(vla get isDynamicBlock o):vlax true))(LM:SetDynamicPropValue o“Offset”di))(princ))(defun shortestdistance frompointtoset(sset pt/i lst)(vl load com)(if sset(repeat(setq i(sslength sset))(setq lst(cons(距离pt(vlax curve GetClosestPoint to(ssname sset(setq i(1-i)))pt))lst)))(car(vl sort lst'

Ohnoto 发表于 2022-7-6 10:05:04

我已将你的网站添加到书签。顺便说一句,网站很好!
 
使用上述代码后,我通过“错误:错误参数类型:VLA-OBJECT nil”得到了一个错误

Lee Mac 发表于 2022-7-6 10:13:50

 
谢谢
 
 
哎呀!我更改了vlax for循环,但没有更改变量“x”。更新于^

Ohnoto 发表于 2022-7-6 10:20:39

谢谢,这太棒了!我现在唯一的问题是:
 
如果我在不同的距离选择多个块,有没有办法得到它,它会根据插入点在属性中输入每个块的距离值?
 
理想情况下,我希望能够分组选择距离直线不同的几个块,并填充每个值,而无需选择块点。
 
我试着做(cdr(assoc 10 s1))而不是提示块的get点,但它不喜欢这样。这是我的书中用来获取中心点的一个例子。我试过谷歌搜索,有没有一个地方列出了做“cons”和“assoc”的组码?

Lee Mac 发表于 2022-7-6 10:21:00

 
http://docs.autodesk.com/ACD/2011/ENU/filesDXF/WSfacf1429558a55de185c428100849a0ab7-5df0.htm
 
我稍后会看一下代码

Ohnoto 发表于 2022-7-6 10:27:29

令人惊叹的谢谢

Lee Mac 发表于 2022-7-6 10:32:01

快速修改,未经测试:
 
(定义c:测试(/blocks di e i o pt s s1 s2)(vl负载com)(setq blocks’(“光纤标记管STA”)i-1)(if(和(setq s1(ssget(list’(0。“INSERT”)(cons 2(应用‘strcat(cons”`*U*“(mapcar’(lambda(s)(strcat,s))块)))))(setq s2(ssget“_X”(list(cons 0“圆弧、圆、椭圆、直线、*多段线、样条”)(cons 8“GPS-ROAD、基线、EOG、EOP、FOGLINE、FOC”))(而(setq e(ssname s1(setq i(1+i))))(if(和(vl位置(strcase)(vlax get property(setq o(vlax ename->vla object e))(if(vlax-property-available-p o‘EffectiveName)’EffectiveName)))块)(等式(vla get isDynamicBlock o):vlax true)(setq di(shortestdistancefromppointtoset s2(trans(cdr(assoc 10(entget e)))e 0))(LM:SetDynamicPropValue o“Offset”di))(princ))(defun shortestdistancefromppointtoset(sset pt/i lst)(vl load com)(if sset(repeat(setq i(sslength sset))(setq lst(cons(距离pt(vlax curve getClosestPointto(ssname sset(setq i(1-i)))pt))lst))(car(vl sort lst'
页: [1] 2
查看完整版本: 与块插入点的距离