明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7256|回复: 22

程序:直线双向偏移并修剪(源码)2017.11.27更新...

[复制链接]
发表于 2017-11-27 11:00 | 显示全部楼层 |阅读模式
本帖最后由 LPACMQ 于 2018-2-25 13:05 编辑
程序:直线双向偏移并修剪(源码)2017.11.27更新...
以下程序采用TRIM 命令的修剪方法,弊端挺多的,要不停的缩放窗口才能勉强保住修剪的准确...
  1. ;;函数
  2. ;;返回参考点的最近点表
  3. (defun cq-getnears (pt lst)
  4.   (vl-sort lst '(lambda(a b)(<(distance a pt)(distance b pt))))
  5. )
  6. ;;返回参考点的最近点  
  7. (defun cq-getnear (pt lst)
  8.   (car (cq-getnears pt lst))
  9. )


  10. ;|程序:直线双向偏移并修剪
  11. ;;作者:LPACMQ 2017.11.26 (笔录: 以下程序采用TRIM 命令的修剪方法,弊端挺多的,如窗口缩放比例会影响修剪效果...个人觉得交点打断的思路编写更为恰当。或采用纯算法画线)|;
  12. (defun c:tt ( / *error* e1 e2 ename enlst i ipt ipts k KEY n name obj1 obj2 pt pt_lst pts ss ssg TN x xpt xpts zpts Zw 距离 正交)

  13.   (defun *error* (msg);;出错处理
  14. ;    (if(or(wcmatch msg "*取消*")(wcmatch msg "*exit*"))
  15. ;       (princ)
  16. ;       (princ msg)
  17. ;    )
  18.     (command ^c)
  19.     (alert "*失败:不能有连接点*")
  20.     (command "undo" "B")
  21.     (princ)
  22.   )
  23.   (setvar 'cmdecho 0)
  24.   (setq TN 1 e1(entlast) ssg(ssadd) pts nil ipts nil xpts nil enlst nil)
  25.   (while TN
  26.       (if (not *距离)(setq *距离 3.0)*距离)
  27.       (setq 距离(getdist (strcat "\n请输入偏移距离:" "<" (rtos *距离) ">")))
  28.       (if (not 距离)(setq 距离 *距离))
  29.       (if (not(< 0. 距离))
  30.           (progn
  31.             (setq TN T)(PRINC "\n*数值必须大于0*")
  32.           )
  33.           (progn
  34.             (setq TN nil)
  35.             (setq *距离 距离)
  36.           )
  37.       )
  38.   );while
  39.   
  40.   (cond (距离
  41.     (princ "\n请选择直线:")
  42.     (setq ss(ssget '((0 . "LINE"))))
  43.     (cond (ss
  44.       (command "undo" "M")
  45.       (command "undo" "be")
  46.       (repeat (setq i(sslength ss))
  47.         (setq ename(ssname ss (setq i(1- i))))
  48.         (setq pt_lst(mapcar 'cdr(vl-remove-if-not '(lambda(x)(member (car x) '(10 11)))(entget ename))))
  49.         (setq 正交(+ (* 0.5 pi)(angle(car pt_lst)(cadr pt_lst))))
  50.         (command "offset" 距离 ename (polar (car pt_lst)正交 1.) "")
  51.         (command "mirror" (entlast)""(car pt_lst)(cadr pt_lst) "")
  52.         (setq enlst(cons ename enlst))
  53.       )
  54.       ;;收集图元
  55.       (setq e2 e1)
  56.       (while (setq e2(entnext e2)) (ssadd e2 ssg))
  57.       
  58.       ;;求交点1列表
  59.       (repeat (setq i(sslength ss))
  60.         (setq obj1(vlax-ename->vla-object(ssname ss (setq i(1- i)))))
  61.         (repeat (setq k(sslength ssg))
  62.           (setq obj2(vlax-ename->vla-object(ssname ssg (setq k(1- k)))))
  63.           (if (setq xpt(vlax-invoke obj1 'IntersectWith obj2 acExtendNone));;acExtendOtherEntity
  64.               (setq xpts(cons xpt xpts))
  65.           )
  66.         )
  67.       )
  68.    
  69.       ;;求交点2列表
  70.       (repeat (setq i(sslength ss))
  71.         (setq name(ssname ss (setq i(1- i))))
  72.         (setq obj1(vlax-ename->vla-object name))
  73.         (setq ss(ssdel name ss))
  74.         (repeat (setq k(sslength ss))
  75.           (setq obj2(vlax-ename->vla-object(ssname ss (setq k(1- k)))))
  76.           (if (setq ipt(vlax-invoke obj1 'IntersectWith obj2 acExtendNone));;acExtendOtherEntity
  77.               (setq ipts(cons ipt ipts))
  78.           )
  79.         )
  80.       )
  81.       
  82.       ;;求交点3列表
  83.       (repeat (setq i(sslength ssg))
  84.         (setq name(ssname ssg (setq i(1- i))))
  85.         (setq obj1(vlax-ename->vla-object name))
  86.         (setq ssg(ssdel name ssg))
  87.         (repeat (setq k(sslength ssg))
  88.           (setq obj2(vlax-ename->vla-object(ssname ssg (setq k(1- k)))))
  89.           (if (setq pt(vlax-invoke obj1 'IntersectWith obj2 acExtendNone));;acExtendOtherEntity
  90.               (setq pts(cons pt pts))
  91.           )
  92.         )
  93.       )
  94.       
  95.       (mapcar '(lambda(x)(entdel x)) enlst);;隐藏
  96.       
  97.       (foreach ipt ipts
  98.         ;;缩放窗口
  99.         (setq zpts(cq-getnears ipt xpts))
  100.         (setq Zw(cq-getnears ipt pts))
  101.         (setq Zw(list(car zw)(cadr zw)(caddr zw)(cadddr zw)))
  102.         (command "zoom" (apply 'mapcar (cons 'max Zw))(apply 'mapcar (cons 'min Zw)))
  103.         (repeat (setq n 4)
  104.           (command  "trim" ssg "" (nth(setq n(1- n))zpts) "")
  105.           (setq e2 e1)(while (setq e2(entnext e2))(ssadd e2 ssg))
  106.         )
  107.         (command "zoom" "p")
  108.       )
  109.       
  110.       ;;恢复
  111.       (mapcar '(lambda(x)(entdel x)) enlst)
  112.       ;;删除中线
  113.       (initget  "Y N")
  114.       (setq KEY (getkword "\n->删除中线[是(Y)/否(N)]<N>"))
  115.       (if (= KEY "Y")(mapcar '(lambda(x)(entdel x)) enlst))
  116.       (command "undo" "e")
  117.     ));cond ss
  118.   ));cond 距离
  119.   (princ)
  120. )




本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
yoyoho + 1 赞一个!

查看全部评分

发表于 2019-1-21 19:39 | 显示全部楼层
楼主,可否加一个倒角值?就是双向偏移再去掉中线以后,类似于一个十字路口,对这个路口的4个角进行倒圆角处理。默认为半径3就行了。
 楼主| 发表于 2017-11-27 22:36 | 显示全部楼层
【KAIXIN】 发表于 2017-11-27 13:38
如果只是直线的话,建议用entmake

确实,用纯算法+entmake更高效。
发表于 2018-8-18 21:53 | 显示全部楼层
dear sir,
learning...
thanks for sharing
发表于 2017-11-27 11:10 来自手机 | 显示全部楼层
还是自己编写吧,没有币
发表于 2017-11-27 11:11 来自手机 | 显示全部楼层
还是自己编写吧,没有币

评分

参与人数 1明经币 +1 收起 理由
LPACMQ + 1 淡定

查看全部评分

发表于 2017-11-27 12:02 | 显示全部楼层
感谢 LPACMQ 分享程序!!!
发表于 2017-11-27 12:05 | 显示全部楼层
看,就不要币了吧
发表于 2017-11-27 13:38 | 显示全部楼层
如果只是直线的话,建议用entmake
发表于 2017-12-3 19:31 | 显示全部楼层
还是自己编写吧,没有币
发表于 2017-12-6 16:56 | 显示全部楼层
还是自己编写吧,没有币
发表于 2018-2-2 12:12 | 显示全部楼层
let me see see
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 09:44 , Processed in 1.753407 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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