明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1897|回复: 8

[提问] 双线内或外偏移

[复制链接]
发表于 2018-12-31 15:16:42 | 显示全部楼层 |阅读模式
这个是论坛里某位前辈的双线内偏移的程序,不知道可否改成外偏移也可以呢。好像要达到可以外偏移似乎有些难度哦,请各位帮忙看看或提些思路啊,谢谢啦 另外可以改成框选(多选)吗
(defun C:PX (/ a dist dist1 ent1 ent2 name1 name2 pt1 pt2 pt3 pt4)
  (setvar "cmdecho" 0)         ; 关闭命令响应
  (setq $orr *error*)
  (setq *error* #err2)         ; 当程序出错时就会执行#err函数
  (command ".UNDO" "BE")        ; 设置UNDO起点
  (setq t 1)
  (while (= t 1)
    (if (setq name1 (car (entsel "\n选择第一条直线:")))
      (progn
(setq ent1 (entget name1))
(if (= (cdr (assoc 0 ent1)) "LINE")
   (progn
     (setq PT1 (cdr (assoc 10 ent1)))
     (setq PT2 (cdr (assoc 11 ent1)))
     (redraw name1 3)
     (setq t 2)
   )
)
      )
    )
  )
  (while (= t 2)
    (if (setq name2 (car (entsel "\n选择第二条直线:")))
      (progn
(setq ent2 (entget name2))
(if (= (cdr (assoc 0 ent2)) "LINE")
   (progn
     (setq PT3 (cdr (assoc 10 ent2)))
     (setq PT4 (cdr (assoc 11 ent2)))
     (if (= (distance PT1 (vlax-curve-getclosestpointto name2 PT1 t)) (distance PT3 (vlax-curve-getclosestpointto name1 PT3 t)))
       (progn
  (setq dist (distance PT1 (vlax-curve-getclosestpointto name2 PT1 t)))
  (redraw name2 3)
  (setq t 3)
       )
       (princ "\n选择的直线不平行,重新选择第二条直线:")
     )
   )
)
      )
    )
  )
  (while (= t 3)
    (if (= chanshu001 nil)
      (setq chanshu001 100.0)
    )
    (setq dist1 (getreal (strcat "\n输入新的平行线距离(应 <" (rtos dist 2) " ) <" (rtos chanshu001 2) ">:")))
    (cond
      ((null dist1)
(setq dist1 chanshu001)
      )
      ((= dist1 0.0)
(setq dist1 chanshu001)
      )
      (t
(setq chanshu001 dist1)
      )
    )
    (if (< dist1 dist)
      (progn
(setq a (/ (- dist dist1) 2))
(command "OFFSET" a name1 PT3 name2 PT1 "")
(setq t 4)
      )
      (princ "\n距离超过原平行线,请重新输入新的平行线距离:")
    )
  )
  (redraw name1 4)
  (redraw name2 4)
  (command ".UNDO" "E")         ; 设置UNDO终点
  (setq *error* $orr)
  (princ)
)
;;; 出错处理函数
(defun #err2 (s)
  (command ".UNDO" "E")         ; 设置UNDO终点
  (redraw name1 4)
  (redraw name2 4)
  (princ)
  (setq *error* $orr)
)


原贴的位置:http://bbs.mjtd.com/forum.php?mo ... AB%D2%C6&page=1

 楼主| 发表于 2018-12-31 15:23:46 | 显示全部楼层
平行的双线同时外侧偏移,找“点”没思路呀,因为每条直线的终起点都会影响的,还有角度等,请教请教
发表于 2019-1-1 11:03:59 | 显示全部楼层
用polar自己构造一个点出来嘛。
发表于 2019-1-1 14:09:33 | 显示全部楼层
本帖最后由 ssyfeng 于 2019-1-2 11:32 编辑

试试这个:
  1. (defun c:tt (/ ang1 ang2 en1 en2 getds nwcs p2 perpt pts1 pts2 qpt qxcs r0 tang)
  2.   (vl-load-com)
  3.   (setq en1 (car (entsel "\n选择第一根平行直线:"))
  4.     en2 (car (entsel "\n选择第二根平行直线:"))
  5.     nwcs (if (null (setq nwcs (getint "\n选择偏移方向 < 1向内,2向外 > [默认:向外]:"))) 2 nwcs)
  6.     pts1 (list (cdr (assoc 10 (entget en1))) (cdr (assoc 11 (entget en1))))
  7.     pts2 (list (cdr (assoc 10 (entget en2))) (cdr (assoc 11 (entget en2))))
  8.     ang1 (angle (car pts1) (cadr pts1))
  9.     ang2 (angle (car pts2) (cadr pts2))
  10.     getds (if (null (setq getds (getreal "\n输入偏移距离[默认:20]:"))) 20 getds)
  11.     perPT (vlax-curve-getclosestpointto en1 (car pts2))
  12.     qxcs (vlax-curve-getparamatpoint en1 perPT)
  13.     qpt (vlax-curve-getFirstDeriv en1 qxcs)
  14.     TAng (angle '(0.0 0.0 0.0) qpt)
  15.     p2 (vlax-curve-getclosestpointto en1 (car pts2))
  16.     r0 (- (angle p2 (car pts2)) TAng)
  17.     r0 (if (< r0 0)
  18.          (+ r0 (* pi 2))
  19.          r0
  20.        )
  21.   )
  22.   (cond ((equal nwcs 1) (setq getds (* getds -1))))
  23.   (if (equal ang1 ang2 0.001)
  24.     (if (<= 0 r0 pi)
  25.       (progn
  26.         (vla-offset (vlax-ename->vla-object en2) getds)
  27.         (vla-offset (vlax-ename->vla-object en1) (* getds -1))
  28.       )
  29.       (progn
  30.         (vla-offset (vlax-ename->vla-object en1) getds)
  31.         (vla-offset (vlax-ename->vla-object en2) (* getds -1))
  32.       )
  33.     )
  34.     (if (<= 0 r0 pi)
  35.       (progn
  36.         (vla-offset (vlax-ename->vla-object en1) (* getds -1))
  37.         (vla-offset (vlax-ename->vla-object en2) (* getds -1))
  38.       )
  39.       (progn
  40.         (vla-offset (vlax-ename->vla-object en2) getds)
  41.         (vla-offset (vlax-ename->vla-object en1) getds)
  42.       )
  43.     )
  44.   )
  45.   (princ)
  46. )



 楼主| 发表于 2019-1-1 21:34:57 | 显示全部楼层

谢谢啦,经过测试,对斜线的内外判断会出错,就是这点不知道如何解决呢,其他的自己可以修改的。希望完善下。拜托了
 楼主| 发表于 2019-1-1 22:10:53 | 显示全部楼层
好像找到原因了,似乎是 nwcs 这个变量有时候一直是 1 ,即使输入2 的时候。还在测试... ... ,再次感谢
发表于 2019-1-1 23:42:07 | 显示全部楼层
本帖最后由 ssyfeng 于 2019-1-2 11:33 编辑

重新修改了一下代码,你试试上面更新后的代码看看。
 楼主| 发表于 2019-1-4 21:45:12 来自手机 | 显示全部楼层
可以了,,谢谢
发表于 2022-2-15 20:36:04 | 显示全部楼层
已下载,好方法,好思路
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 05:37 , Processed in 0.180729 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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