明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4202|回复: 23

[讨论] 如何实现选取边界自动偏移并插入块

[复制链接]
发表于 2013-12-10 12:04 | 显示全部楼层 |阅读模式
试搞了一下,搞不定请各位大神帮忙。如何实现选取矩形四边,然后自动偏移,然后标注ABCD,然后插入图示的2个块

本帖子中包含更多资源

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

x
发表于 2013-12-10 12:16 | 显示全部楼层
直线偏移方向不好控制
 楼主| 发表于 2013-12-10 12:20 | 显示全部楼层
是的,所以不好解决,大侠,有什么思路
 楼主| 发表于 2013-12-10 12:23 | 显示全部楼层
网上到是有个内偏的,但是处理的是连续
  1. ;;;******内缩偏移 程序开始*****
  2. (princ "\n★内缩偏移命令:ns ★\n")
  3. (defun c:ns ()
  4.   (setvar "blipmode" 0)
  5.   (setvar "pickfirst" 1)
  6.   (setvar "osmode" 15359)
  7.   (setvar "cmdecho" 0)
  8.   (princ "\n★功能:批量将多段线、圆弧、圆进行内缩偏移.\n")
  9.   (command "ucs" "w")
  10.   (command "undo" "be")
  11.   (initget 6)
  12.   (setq dist (getreal "\n输入要内缩偏移的距离<0.004>:"))
  13.   (if (not dist)
  14.     (setq dist 0.004)
  15.   )
  16.   (princ "\n选择要内缩偏移的对象:\n")
  17.   (setq ss (ssget '((0 . "CIRCLE,ARC,LWPOLYLINE"))))
  18.   (if (not ss)
  19.     (exit)
  20.   )
  21.   (setq num (sslength ss))
  22.   (setvar "osmode" 0)
  23.   (setq        i 0
  24.         j 0
  25.   )
  26.   (command "LAYER" "M" "标记层" "C" "1" "标记层" "")
  27.   (command "LAYER" "M" "内缩" "C" "6" "内缩" "")
  28.   (vl-load-com)
  29.   (repeat num
  30.     (setq entnam (ssname ss i))
  31.     (setq obj (vlax-ename->vla-object entnam))
  32.     (setq len (vlax-curve-getdistatparam
  33.                 obj
  34.                 (vlax-curve-getendparam obj)
  35.               )
  36.     )
  37.     (vla-offset obj 0.00001)
  38.     (setq objlast (entlast))
  39.     (setq lenlast (vlax-curve-getdistatparam
  40.                     objlast
  41.                     (vlax-curve-getendparam objlast)
  42.                   )
  43.     )
  44.     (entdel objlast)
  45.     (cond ((< lenlast len)
  46.            (progn
  47.              (vla-offset obj dist)
  48.              (setq en (entget (entlast)))
  49.              (entmod (subst (cons 8 "内缩") (assoc 8 en) en))
  50.            )
  51.           )
  52.           ((> lenlast len)
  53.            (progn
  54.              (vla-offset obj (* -1 dist))
  55.              (setq en (entget (entlast)))
  56.              (entmod (subst (cons 8 "内缩") (assoc 8 en) en))
  57.            )
  58.           )
  59.           ((= lenlast len)
  60.            (progn
  61.              (setq en (entget entnam))
  62.              (entmod (subst (cons 8 "标记层") (assoc 8 en) en))
  63.              (setq j (+ 1 j))
  64.            )
  65.           )
  66.     )
  67.     (setq i (1+ i))
  68.   )
  69.   (command "undo" "e")
  70.   (princ "\n★将选取对象进行内缩偏移成功.\n")
  71.   (if (> j 0) (princ (strcat "★提示:有" (itoa j) "个对象因无法判定偏移方向,未进行内缩偏移,已将其置于“标记层”。\n")))
  72.   (setvar "osmode" 15359)
  73.   (princ)
  74. )
  75. ;;;******内缩偏移 程序结束******
的单条的线
 楼主| 发表于 2013-12-10 12:25 | 显示全部楼层
;;这个是处理块的
  1. (defun c:dj ()
  2. &#160; &#160; (setq i 0)
  3. &#160; &#160; (setq pline (car (entsel)))
  4. &#160; &#160; (setq ent (entget pline))
  5. &#160; &#160; (setq pts nil)
  6. &#160; &#160; (repeat (length ent)
  7. &#160; &#160; (if (= (car (nth i ent)) 10)

  8. ;(setq pts (append pts (list (cdr (nth i ent)))))
  9. (setq p0&#160;&#160;(cdr (nth i ent)))
  10. &#160;&#160;(ins)
  11. &#160; &#160; )
  12. &#160; &#160; (setq i (1+ i))
  13. &#160;&#160;)
  14. (entdel pline)

  15. &#160; &#160;&#160; &#160; (princ)
  16. )

  17. (defun ins ()
  18. ;(setq p1 (getpoint "\n梁内边左下端点为起点: "))
  19. (COMMAND "-insert"&#160;&#160;"点筋" p0 "1" "1" "0" )
  20. (princ)
  21. )
 楼主| 发表于 2013-12-10 12:27 | 显示全部楼层
  1. (defun c:zm1 (/ mycopy mymove SstoEs sign ss p1 p2)
  2.   (defun SstoEs(ss / a en lst)
  3.     (if ss(progn(setq a -1)(while(setq en(ssname ss(setq a(1+ a))))(setq lst (cons en lst)))))
  4.     lst)
  5.   (defun sign (nn) (if (< nn 0) -1 (if (> nn 0) 1 0)))
  6.   (defun mycopy(ss p p1 / ty q q1 s1 s2);;参照by-xyp1964的xyp-ScaleEntity
  7.     (setq ty(type ss)i -1
  8.     s2(ssadd)
  9.     q1(vlax-3D-point(trans p1 0 0))
  10.     q(vlax-3D-point(trans p 0 0)))
  11.     (cond((= ty 'ENAME)(vla-move(vla-copy(vlax-ename->vla-object ss))q q1)(setq s2(ssadd(entlast)s2)))
  12.    ((= ty 'PICKSET)
  13.     (setq i -1)
  14.     (while (setq s1 (ssname ss (setq i (1+ i))))
  15.       (mycopy s1 p p1)(setq s2(ssadd(entlast)s2))))
  16.    ((= ty 'LIST)(foreach x ss(mycopy x p p1)(setq s2(ssadd(entlast)s2))))
  17.    )s2)
  18.   (defun mymove(ss p p1 / ty q q1 s1);;参照by-xyp1964的xyp-ScaleEntity
  19.     (setq ty(type ss)i -1
  20.     q1(vlax-3D-point(trans p1 0 0))
  21.     q(vlax-3D-point(trans p 0 0)))
  22.     (cond((= ty 'ENAME)(vla-move(vlax-ename->vla-object ss)q q1))
  23.    ((= ty 'PICKSET)
  24.     (setq i -1)
  25.     (while (setq s1 (ssname ss (setq i (1+ i))))
  26.       (mymove s1 p p1)))
  27.    ((= ty 'LIST)(foreach x ss(mymove x p p1))))
  28.     )
  29.   (setq ind (getint "\n输入增减量<1> :")
  30.         ind (sign ind))
  31.   (prompt"\n选择要进行递增复制的文字、属性")
  32.   (setq ss(SstoEs(ssget'((0 . "*TEXT,ATTDEF")))))
  33.   (setq p1(getpoint"复制基点"))
  34.   (setq p2(getpoint p1"复制到"))
  35.   (mycopy (setq ss(vl-remove'nil(mapcar'(lambda(x)(setq e(entget x))
  36.       (if(assoc 1 e)
  37.         (progn(setq tx(vl-string->list (cdr(assoc 1 e))))
  38.     (if(OR(<(IF(> ind 0)65 66)(last tx)(IF(> ind 0)89 90))
  39.           (<(IF(> ind 0)97 98)(last tx)(IF(> ind 0)121 122)))x))))ss)))p1 p1)
  40.   (mymove ss p1 p2)
  41.   (mapcar'(lambda(x)(entmod(setq e(entget x)
  42.         tx(vl-string->list (cdr(assoc 1 e)))
  43.         e(subst(cons 1 (vl-list->string(reverse(cons((IF(> ind 0)1+ 1-)(last tx))(cdr(reverse tx))))))(assoc 1 e)e)))
  44.       nil)ss)
  45. (princ)
  46. )
  47. ;;这个是字母递增复制,貌似ABCD直接写入也行
发表于 2013-12-10 18:54 | 显示全部楼层
本帖最后由 q3_2006 于 2013-12-10 19:19 编辑

图块做得标准,这个很简单,但你的块也太随意了,还要计算插入点。。。另外,如果全部是矩形,只要做个动态块就搞定了。。不用写程序的。。。
 楼主| 发表于 2013-12-10 21:45 | 显示全部楼层
q3_2006 发表于 2013-12-10 18:54
图块做得标准,这个很简单,但你的块也太随意了,还要计算插入点。。。另外,如果全部是矩形,只要做个动态 ...

是啊,难就难在图形不是矩形而是四条线,大神有解么
 楼主| 发表于 2013-12-10 21:46 | 显示全部楼层
另外,插入点可以是直线的中点,计算中点应该难度会有所减小吧
 楼主| 发表于 2013-12-10 22:21 | 显示全部楼层
  1. (defun c:tt (/ make-extline area d e npts pts tf tf1 an)
  2.   (defun make-extline (pts / ln ptl)
  3.     (setq ln  (apply 'xdrx_line_make pts) ;创建LINE实体
  4.           ptl (xdrx_curve_getinters (ssname ln 0) (car e) 1) ;两个AcDbCurve(曲线)实体的交点
  5.     )
  6.     (xdrx_setpropertyvalue  ;设置对象的属性值
  7.       (ssname ln 0)
  8.       "startpoint"
  9.       (car ptl)
  10.       "endpoint"
  11.       (cadr ptl)
  12.     )
  13.   )
  14.   (while
  15.     (and (setq e (xdrx_entsel "\nPick Pline: " '((0 . "*polyline")))) ;单选符合过滤表条件的实体
  16.       (progn
  17.         (initget "A")
  18.         (setq d (getdist (cadr e) "\nOffeset Dist [A - all]: "))
  19.         (if (= d "A")
  20.           (setq d  (getdist (cadr e) "\nOffeset Dist: ")
  21.                 tf t
  22.           )
  23.           d
  24.         )
  25.       )
  26.     )
  27.     (setq pts (xdrx_entity_getstretchpoint (car e)) ;获取实体的stretch点  点表(WCS)
  28.           area (apply 'xdrx_points_area pts) ;获得点表组成的多边形的面积
  29.           tf1 (xdrx_curve_isclosed (car e))  ;判断两曲线是否共面
  30.     )
  31.     (if (minusp area)
  32.       (progn (xdrx_curve_reverse (car e)) ;判断两曲线是否共面
  33.         (if tf1
  34.           (xdrx_curve_setclosed (car e)) ;封闭曲线
  35.         )
  36.       )
  37.     )
  38.     (if tf
  39.       (progn
  40.         (setq npts (xdrx_curve_offset (car e) (- d)))  ;OFFSET给定距离后的,曲线点表
  41.         (mapcar '(lambda (x y / ln) (make-extline (list x y))) npts (cdr npts))
  42.       )
  43.       (progn
  44.         (setq npts
  45.           (xdrx_polyline_getlinesegat  ;获得一个直线段顶点的直线段数据 (起点 终点)
  46.             (car e)
  47.             (fix (vlax-curve-getParamAtPoint (car e) (vlax-curve-getClosestPointTo (car e) (cadr e))))
  48.           )
  49.           an   (+ (* pi 0.5) (apply 'angle npts))
  50.           npts (mapcar '(lambda (x) (polar x an d)) npts)
  51.           ;;(apply 'xdrx_points_offset (cons (- d) npts));_ Bug
  52.         )
  53.         (make-extline npts)
  54.        )
  55.      )
  56.   )
  57.   (princ)
  58. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-8 23:01 , Processed in 1.685906 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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