明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2233|回复: 20

[提问] 多段线只偏移圆弧 修改

[复制链接]
发表于 2022-8-30 13:15:06 | 显示全部楼层 |阅读模式
想请问版上的大佬们
此代码能不能修改成多段线 偏移只选择圆弧不选择直线偏移
此段拿掉LINE 其实也可以达到效果 但是需要炸开
(if (setq ss (ssget '((0 . "*LINE,CIRCLE,ARC"))))
有没有在不炸开的情况下只偏移圆弧

(defun C:tt ( / curve ent holdcmd holdosmode jang n pt pt1 pt2 ss tmp x)
  (defun LEN (CURVE / TLEN)
    (setq TLEN (vlax-curve-getdistatparam
   CURVE
   (vlax-curve-getendparam CURVE)
        )
    )
  )

  (command "_.UNDO" "BE")
  (if (null tee_dist)
    (setq tee_dist 0.2)
  ) ;_设置全局变量
  (setq HOLDOSMODE (getvar "OSMODE"))
  (setq HOLDCMD (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (setvar "OSMODE" 0)
(if (setq ss (ssget '((0 . "*LINE,CIRCLE,ARC"))))
    (progn
      (setq n 0)
      (initget 2)
      (if (setq tmp
   (getdist
     (strcat "\n指定偏移距离(输入偏移距离): <"
      (rtos tee_dist 2)
      ">"
     )
   )
   )
(setq tee_dist tmp)
      ) ;_不输入时自动使用上一次输入数值
      (repeat (sslength ss)
(setq ent (ssname ss n)
       n   (1+ n)
)

(setq CURVE (vlax-ename->vla-object ENT)
       x     (vlax-curve-getParamAtDist curve (/ (len curve) 3.33))
       pt    (vlax-curve-getPointAtParam curve x)
);_获得线上指定距离值的点及参数


(setq JANG (angle '(0 0 0) (vlax-curve-getfirstderiv CURVE X)))
(setq PT1 (polar PT (+ JANG (* 0.5 pi)) 0.00000001))
(setq PT2 (polar PT (- JANG (* 0.5 pi)) 0.00000001))
(command "layer" "m" "补点" "c" 1 "补点" "");新建补点图层 6为洋红色
;;(command "_.OFFSET" (abs tee_dist) ENT PT1 "")
(command "_.OFFSET" "L" "C" (abs tee_dist) ENT PT1 "")

(if (or (and (> tee_dist 0) (> (LEN CURVE) (LEN (entlast))))
  (and (< tee_dist 0) (< (LEN CURVE) (LEN (entlast))))
     )
   (progn
     (entdel (entlast))
     (command "_.OFFSET" (abs tee_dist) ENT PT2 "")
   )
)
      )
    )
  )
  (setvar "OSMODE" HOLDOSMODE)
  (setvar "CMDECHO" HOLDCMD)
  (command "_.UNDO" "E")
  (princ)
)




发表于 2022-8-30 16:06:42 | 显示全部楼层
一个笨办法,是否可以,先偏移,再炸开,再删除非圆弧对象
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-31 17:07:43 | 显示全部楼层
本帖最后由 llsheng_73 于 2022-9-1 17:50 编辑
ga619091 发表于 2022-8-31 11:24
可能误会我意思
原始代码 多段线或者炸开的线段都能做偏移
但把LINE拿掉 就可以炸开只选择圆弧做 ...

选择包含凸度的多段线,
不严谨的做法:遍历多段线的点p,如果它的凸度值不为0,取它的下一点及中间点,这样就有弧段起止点及中点,根据3点共圆计算圆心,
根据圆心和起止点的角度及半径加上偏移距离计算偏移后的新的起止点,用取得的凸度值画一个弧段
  1. (defun 3pcen(p1 p2 p3)
  2.   (setq p1(list(/(+(car p1)(car p2))2)(/(+(cadr p1)(cadr p2))2))
  3.         p3(list(/(+(car p2)(car p3))2)(/(+(cadr p2)(cadr p3))2)))
  4. (inters p1(polar p1(+(/ pi 2)(angle p1 p2))1)p3(polar p3(+(/ pi 2)(angle p3 p2))1)nil))
  5. (defun tt(e / en n p p1 p0 r bugle i)
  6.   (setq en(entget e'("*"))n(vlax-curve-getendparam e)e(vlax-ename->vla-object e)i -1)
  7.   (while(<(setq i(1+ i))n)
  8.       (or(VL-CATCH-ALL-ERROR-P(setq p(vlax-curve-getpointatparam e i)
  9.                                     bugle(VL-CATCH-ALL-APPLY'vlax-invoke-method(List  e 'GetBulge i))))
  10.          (and(/= bugle 0)
  11.              (setq p1(vlax-curve-getpointatparam e(1+ i)))
  12.              (setq p0(vlax-curve-getpointatparam e(+ i 0.5)))
  13.              (setq p0(3pcen p p0 p1)r(+(distance p0 p)d))
  14.              (entmakex(vl-remove'nil(append(mapcar'cons'(0 100 100 62 8 90 70 10 42 10)
  15.                              (list"LWPOLYLINE""AcDbEntity""AcDbPolyline"1"bmcl"2 128(polar p0(angle p0 p)r)bugle(polar p0(angle p0 p1)r)))
  16.                              (mapcar'(lambda(x)(assoc x en))'(6 8 62 370 38 -3)))))))))

  17. (defun c:tt(/ s e d)
  18.   (or(setq d(getdist"偏移距离[1.0]"))(setq d 1))
  19.   (if(setq s(ssget '((0 . "lwpolyline")(-4 . "/=")(42 . 0))))
  20.   (while(setq e(ssname s 0))
  21.     (ssdel e s)
  22.     (tt e)
  23.     )))


更严格的做法应该是:根据偏移距离先偏移整条多段线,再找出其中的弧段来重新绘制,删除偏移后的线

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2022-9-1 17:42:07 | 显示全部楼层
本帖最后由 llsheng_73 于 2022-9-1 17:50 编辑
ga619091 发表于 2022-9-1 17:19
73大 能帮我看一下代码问题
我在你的代码基础上改成匡选加偏移的弧形红色显示
匡选可以 但是弧形偏移

原来(mapcar 'cons '(0 100 100 90 70 10 42 10)(list "LWPOLYLINE" "AcDbEntity" "AcDbPolyline" 2 128 (polar p0(angle p0 p)r) bugle (polar p0 (angle p0 p1)r))
加一个62组和8组就可以控制颜色和图层了
(mapcar 'cons '(0 100 100 62 90 70 10 42 10 )(list "LWPOLYLINE" "AcDbEntity" "AcDbPolyline"1 2 128 (polar p0(angle p0 p)r) bugle (polar p0 (angle p0 p1)r))


还是看12楼修改后的吧,你修改那个实在费看。。。


 楼主| 发表于 2022-8-30 16:18:22 | 显示全部楼层
Sonnenblumen 发表于 2022-8-30 16:06
一个笨办法,是否可以,先偏移,再炸开,再删除非圆弧对象

那就跟我文字说明意思一样  就是希望不炸开的情况下只偏移圆弧
发表于 2022-8-30 21:48:46 | 显示全部楼层
(setq ss (ssget '((0 . "*LWPOLYLINE,CIRCLE,ARC"))))
改成这样就可以不选择直线了,只选择多线段 我也不知道原理
 楼主| 发表于 2022-8-31 08:24:43 | 显示全部楼层
liuhe 发表于 2022-8-30 21:48
(setq ss (ssget '((0 . "*LWPOLYLINE,CIRCLE,ARC"))))
改成这样就可以不选择直线了,只选择多线段 我也不 ...

那个写法还是会选择直线
跟我前面说要炸开才不选择直线依样
是希望能在不炸开的情况
直接偏移不选择直线
发表于 2022-8-31 08:34:38 | 显示全部楼层
ga619091 发表于 2022-8-31 08:24
那个写法还是会选择直线
跟我前面说要炸开才不选择直线依样
是希望能在不炸开的情况

pl线是多线段啊,pl线包括圆
发表于 2022-8-31 09:46:50 | 显示全部楼层
先偏移后再炸开偏移后的再删除不要的,保持偏移方向正确
 楼主| 发表于 2022-8-31 11:24:20 | 显示全部楼层
liuhe 发表于 2022-8-31 08:34
pl线是多线段啊,pl线包括圆



可能误会我意思
原始代码 多段线或者炸开的线段都能做偏移
但把LINE拿掉 就可以炸开只选择圆弧做偏移
已经有我想要的效果 就如右图那样
(setq ss (ssget '((0 . "*LWPOLYLINE,CIRCLE,ARC"))))

上面你说的修改方式 也是一样达到右边或者左边的效果
但需要多炸开这个步骤才不选择直线
我是想问有没有办法再不炸开的情况下
多段线只选择圆弧做偏移



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2022-8-31 13:29:47 | 显示全部楼层
ga619091 发表于 2022-8-31 11:24
可能误会我意思
原始代码 多段线或者炸开的线段都能做偏移
但把LINE拿掉 就可以炸开只选择圆弧做 ...

你会lisp编程么?我可以提供给你思路,自己写。先创立一个选择集,识别图元或者句柄,分解掉选择集。再次利用上次选择集点 创立新的选择集,此时里面是直线和圆弧都有,删掉直线保留圆弧,偏移执行。删掉原来 都圆弧,再恢复最初都图形。
发表于 2022-8-31 13:31:41 | 显示全部楼层
你这个功能没什么意思,想利用ssget一开始过滤所谓直线是不行的,因为他们是一个整体,或者得到图元分析所有坐标,得出圆弧坐标,那是编程员思维,不是画图人工思维
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-23 17:51 , Processed in 0.211308 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表