找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2133|回复: 15

[研讨] 点集offset

[复制链接]

已领礼包: 604个

财富等级: 财运亨通

发表于 2018-2-19 20:02:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
对于点集(可以组成凸多边形)偏移,假如不使用命令 _offset,有什么好的写法么?
1.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-2-19 21:31:22 | 显示全部楼层
本帖最后由 marting 于 2018-2-19 21:34 编辑

不用OFFSET命令,那就vla-offset了
下面代码,没加入错误判断,需要自己加上就行了。
  1. (defun pntsOffset (pts dis / o)
  2.   (entmakex
  3.     (append (list '(0 . "LWPOLYLINE")
  4.                   '(100 . "AcDbEntity")
  5.                   '(100 . "AcDbPolyline")
  6.                   (cons 90 (length pts))
  7.             )
  8.             (mapcar '(lambda (x) (cons 10 (list (car x) (cadr x)))) pts)
  9.     )
  10.   )
  11.   (setq o (vlax-ename->vla-object (setq e (entlast))))
  12.   (vla-put-closed o :vlax-true)
  13.   (vla-offset o dis)
  14.   (vla-delete o)
  15.   (setq        pts (vl-remove-if
  16.               '(lambda (x) (/= (car x) 10))
  17.               (entget (entlast))
  18.             )
  19.   )
  20.   (entdel (entlast))
  21.   (mapcar '(lambda(x)(append (cdr x) (list 0.0))) pts)
  22. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-2-19 21:45:59 | 显示全部楼层
加入出错判断

  1. (defun pntsOffset (pts dis / o)
  2.   (entmakex
  3.     (append (list '(0 . "LWPOLYLINE")
  4.                   '(100 . "AcDbEntity")
  5.                   '(100 . "AcDbPolyline")
  6.                   (cons 90 (length pts))
  7.             )
  8.             (mapcar '(lambda (x) (cons 10 (list (car x) (cadr x)))) pts)
  9.     )
  10.   )
  11.   (setq o (vlax-ename->vla-object (setq e (entlast))))
  12.   (vla-put-closed o :vlax-true)
  13.   (if (not (vl-catch-all-error-p
  14.              (vl-catch-all-apply 'vla-offset (list o dis))
  15.            )
  16.       )
  17.     (progn (vla-delete o)
  18.            (setq pts (vl-remove-if
  19.                        '(lambda (x) (/= (car x) 10))
  20.                        (entget (entlast))
  21.                      )
  22.            )
  23.            (entdel (entlast))
  24.            (mapcar '(lambda (x) (append (cdr x) (list 0.0))) pts)
  25.     )
  26.     (progn (vla-delete o) (princ "指定距离无法offset.") (princ))
  27.   )
  28. )


评分

参与人数 1D豆 +5 收起 理由
/db_自贡黄明儒_ + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2018-2-19 22:13:00 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2018-2-19 22:15 编辑

我先求点,然后生成多段线
  1. ;;多段线顶点
  2. ;;(setq pts (_HH:GetLwPts (car (entsel))))
  3. (defun _HH:GetLwPts (e)
  4.   (mapcar 'cdr
  5.           (vl-remove-if-not '(lambda (x) (equal 10 (car x)))
  6.                             (entget e)
  7.           )
  8.   )
  9. )
  10. ;;(_PtsOffset pts 20)
  11. (defun _PtsOffset (pts d Flag / 5PI ANG L X Y)
  12.   (if Flag
  13.     (setq 5pi (* pi -0.5))
  14.     (setq 5pi (* pi 0.5))
  15.   )
  16.   (mapcar
  17.     '(lambda (x y)
  18.        (setq ang (+ (angle x y) 5pi))
  19.        (setq L (cons (list (polar x ang d) (polar y ang d)) L))
  20.      )
  21.     (cons (last pts) pts)
  22.     pts
  23.   )
  24.   (setq pts nil)
  25.   (mapcar
  26.     '(lambda (x y)
  27.        (setq pts (cons (apply 'inters (append x y (list nil))) pts))
  28.      )
  29.     (cons (last L) L)
  30.     L
  31.   )
  32.   pts
  33. )
  34. ;;由于不知点集顺时针还是逆时针,Flag=T时外偏移
  35. (defun _PtsOffsetOutIn (pts d Flag / D1 D2 FUN P)
  36.   (if Flag
  37.     (setq fun >)
  38.     (setq fun <)
  39.   )
  40.   (setq d1 (distance (car pts) (cadr pts)))
  41.   (setq p (_PtsOffset pts d Flag))
  42.   (setq d2 (distance (car p) (cadr p)))
  43.   (if (fun d2 d1)
  44.     p
  45.     (_PtsOffset pts d (not Flag))
  46.   )
  47. )

  48. ;;测试
  49. (defun C:w1 (/ L PTS);向外offset
  50.   (setq pts (_HH:GetLwPts (car (entsel))))
  51.   (setq L (_PtsOffsetOutIn pts 20 T))
  52.   (_EntmakeLWPOLYLINE L)
  53.   (princ)
  54. )
  55. (defun C:w2 (/ L PTS);向内offset
  56.   (setq pts (_HH:GetLwPts (car (entsel))))
  57.   (setq L (_PtsOffsetOutIn pts 20 nil))
  58.   (_EntmakeLWPOLYLINE L)
  59.   (princ)
  60. )

1.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-2-19 22:30:56 | 显示全部楼层

函数最好是根据距离的正负,来外偏或者内偏,这样调用更方便。
距离的正负,根据OFFSET的选点方向确定,这样就不用人为的用固定的外偏或者内偏两个命令。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2018-2-19 22:51:07 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2018-2-19 22:53 编辑

这个建议好{:4_4:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-2-19 22:53:53 | 显示全部楼层
本帖最后由 marting 于 2018-2-19 22:55 编辑

比如,下面这两个,可以让用户输入距离,一次多次偏移

                               
登录/注册后可看大图

动态拖动偏移


                               
登录/注册后可看大图






论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2018-2-19 23:31:39 | 显示全部楼层

staggeredoffset.gif

  1. (defun c:staggeredoffset (/ d d2 obj offdir pp pp2 tmp1 tmp2)
  2.   (vl-load-com)
  3.   (if (and (setq obj (entsel "\nSelect object to offset: "))
  4.            (setq pp (cadr obj))
  5.            (setq obj (vlax-ename->vla-object (car obj)))
  6.            (/= (vla-get-objectname obj) "AcDbBlockReference")
  7.            (setq pp2 (getpoint pp "\nEnter direction and offset distance: "))
  8.            (setq d (distance pp pp2))
  9.            (setq d2 (* d 0.01))
  10.       )
  11.     (progn
  12.       (setq tmp1 (car (vlax-invoke obj "offset" d2))
  13.             tmp2 (car (vlax-invoke obj "offset" (* -1 d2)))
  14.       )
  15.       (if (< (distance pp2 (vlax-curve-getclosestpointto tmp1 pp2))
  16.              (distance pp2 (vlax-curve-getclosestpointto tmp2 pp2))
  17.           )
  18.         (setq offdir 1)
  19.         (setq offdir -1)
  20.       )
  21.       (vla-delete tmp1)
  22.       (vla-delete tmp2)
  23.       (while (and (setq        obj (vl-catch-all-apply
  24.                               'vlax-invoke
  25.                               (list obj "offset" (* offdir d2))
  26.                             )
  27.                   )
  28.                   (not (vl-catch-all-error-p obj))
  29.                   (setq obj (car obj))
  30.                   (<= d2 d)
  31.              )
  32.         (setq d2 (+ d2 (* 0.1 d2))
  33.               d         (- d d2)
  34.         )
  35.         (vla-update obj)
  36.       )
  37.     )
  38.   )
  39.   (princ)
  40. )


评分

参与人数 1D豆 +5 收起 理由
/db_自贡黄明儒_ + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2230个

财富等级: 金玉满堂

发表于 2018-2-20 08:47:26 | 显示全部楼层
比单个的偏移快多了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2018-2-20 12:02:44 | 显示全部楼层
谢谢分享。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2018-3-3 12:34:28 | 显示全部楼层
牛的人代码不能错过
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 812个

财富等级: 财运亨通

发表于 2018-3-3 13:34:35 | 显示全部楼层
感谢各位的代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-2-1 21:51:10 | 显示全部楼层
本帖最后由 xyp1964 于 2019-2-1 21:52 编辑

  1. (defun c:tt ()
  2.   (setq e  (entsel "\n选择偏移实体: ")
  3.         s1 (car e)
  4.         p1 (cadr e)
  5.         p2 (getpoint p1 "\n终点<退出>: ")
  6.         dd (distance p1 p2)
  7.         d0 (* dd 0.01)
  8.         d1 d0
  9.   )
  10.   (while (< d1 dd)
  11.     (command "offset" d1 s1 p2 "")
  12.     (setq d0 (* d0 1.1)
  13.           d1 (+ d1 d0)
  14.     )
  15.   )
  16.   (princ)
  17. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2256个

财富等级: 金玉满堂

发表于 2019-2-1 22:04:41 | 显示全部楼层
谢谢分享。。。。。?。。。。?????????。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 2256个

财富等级: 金玉满堂

发表于 2019-2-1 22:06:10 | 显示全部楼层
谢谢分享。。。。。。。。。。。。。。。。。。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-20 17:08 , Processed in 0.429206 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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