明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: njcknfy

自己动手,改进CASS中欠缺的功能

    [复制链接]
 楼主| 发表于 2014-10-7 15:10 | 显示全部楼层
  1. (defun c:xianlong_text        ()
  2.   ;;标注线段长度
  3.   (if (/= (getvar "DIMZIN") 0)
  4.     (setvar "DIMZIN" 0))                ;保留小数位数不消零
  5.   (setq        textzg
  6.          (getreal
  7.            (strcat "\n请输入注记字高:<" (rtos (getvar "textsize") 2 2) ">")))
  8.   (if (= textzg nil)
  9.     (setq textzg (getvar "textsize"))
  10.     (setvar "textsize" textzg))
  11.   (setq xian_s (ssget (list (cons 0 "*LINE"))))
  12.   (setq        textlay          (getvar "CLAYER")
  13.         textthk          0.0
  14.         textkuan  1.0
  15.         textqxie  0.0
  16.         textcolor nil
  17.         textstyle "STANDARD"
  18.         textlcr          1
  19.         textdmh          2)
  20.   (if (/= nil xian_s)
  21.     (progn
  22.       (setq xian_slen (sslength xian_s))
  23.       (setq xian_l 0)
  24.       (repeat xian_slen
  25.         (setq pline_ename (ssname xian_s xian_l))
  26.         (setq pline_list (vertexs pline_ename))
  27.         (if (/= nil pline_list)
  28.           (progn
  29.             (setq pt_num 0
  30.                   textpt2 nil
  31.                   textpt1 nil)
  32.             (repeat (length pline_list)
  33.               (cond
  34.                 ;;记录注记第一点
  35.                 ((= pt_num 0)
  36.                  (setq textpt1 (list (nth 0 (nth pt_num pline_list))
  37.                                      (nth 1 (nth pt_num pline_list))
  38.                                      0.0)))
  39.                 ;;记录注记第二点,注记距离
  40.                 ((> pt_num 0)
  41.                  (progn
  42.                    (setq textpt2  (list        (nth 0 (nth pt_num pline_list))
  43.                                         (nth 1 (nth pt_num pline_list))
  44.                                         0.0)
  45.                          xianlen  (distance textpt1 textpt2)
  46.                          textnr          (rtos xianlen 2 2)
  47.                          textpt10 (mapcar
  48.                                     '*
  49.                                     (list 0.5 0.5 0.0)
  50.                                     (list
  51.                                       (+ (nth 0 textpt1) (nth 0 textpt2))
  52.                                       (+ (nth 1 textpt1) (nth 1 textpt2))
  53.                                       0.0))
  54.                          textpt11 textpt10)
  55.                    (if (and (> (angle textpt1 textpt2) (* 0.517 pi))
  56.                             (<= (angle textpt1 textpt2) (* 1.517 pi)))
  57.                      (setq textro (+ (angle textpt1 textpt2) pi))
  58.                      (setq textro (angle textpt1 textpt2)))
  59.                    (emaketext textlay textnr textthk textpt10 textzg textro
  60.                               textkuan textqxie        textcolor textstyle textlcr
  61.                               textdmh textpt11)
  62.                    (setq textpt1 textpt2
  63.                          textpt2 nil)))
  64.                 (t nil))
  65.               (setq pt_num (1+ pt_num)))))
  66.         (setq xian_l (1+ xian_l))))))
  67. (defun vertexs        (pline_ename / plist pline_list n)
  68.   ;;返回多段线的各顶点
  69.   ;;语法:(vertexs pline_ename)
  70.   ;;pline_ename :(LINE POLYLINE LWPOLYLINE)实体的图元名
  71.   ;;返回:各顶点形成的点列表        
  72.   ;;加载(vl-load-com)环境
  73.   (vl-load-com)
  74.   (setq        acadobject1   (vlax-get-acad-object)
  75.         acaddocument1 (vla-get-activedocument acadobject1)
  76.         mspace1              (vla-get-modelspace acaddocument1))
  77.   (setq pline_list nil)
  78.   (cond
  79.     ;;当实体为LINE
  80.     ((= (cdr (assoc 0 (entget pline_ename))) "LINE")
  81.      (progn (setq pline_list
  82.                    (append pline_list
  83.                            (list (cdr (assoc 10 (entget pline_ename)))
  84.                                  (cdr (assoc 11 (entget pline_ename))))))))
  85.     ;;当实体为LWPOLYLINE或POLYLINE
  86.     ((or (= (cdr (assoc 0 (entget pline_ename))) "LWPOLYLINE")
  87.          (= (cdr (assoc 0 (entget pline_ename))) "POLYLINE"))
  88.      (progn (setq obj (vlax-ename->vla-object pline_ename))
  89.             (setq
  90.               plist (vlax-safearray->list (vlax-variant-value (vla-get-coordinates obj))))
  91.             (setq n 0)
  92.             (cond ((= (cdr (assoc 0 (entget pline_ename))) "LWPOLYLINE")
  93.                    (progn (repeat (/ (length plist) 2)
  94.                             (setq pline_list
  95.                                    (append pline_list
  96.                                            (list (list (atof (rtos (nth n plist) 2 3))
  97.                                                        (atof (rtos (nth (1+ n) plist) 2 3))))))
  98.                             (setq n (+ n 2)))))
  99.                   ((= (cdr (assoc 0 (entget pline_ename))) "POLYLINE")
  100.                    (progn (repeat (/ (length plist) 3)
  101.                             (setq pline_list
  102.                                    (append pline_list
  103.                                            (list (list (atof (rtos (nth n plist) 2 3))
  104.                                                        (atof (rtos (nth (1+ n) plist) 2 3))
  105.                                                        (atof (rtos (nth (+ n 2) plist) 2 3))))))
  106.                             (setq n (+ n 3))))))))
  107.     (t (setq pline_list nil)))
  108.   (if (and (or (= (cdr (assoc 0 (entget pline_ename))) "LWPOLYLINE")
  109.                (= (cdr (assoc 0 (entget pline_ename))) "POLYLINE"))
  110.            (or (= (cdr (assoc 70 (entget pline_ename))) 129)
  111.                (= (cdr (assoc 70 (entget pline_ename))) 1)))
  112.     (setq pline_list (append pline_list (list (nth 0 pline_list)))))
  113.   pline_list)
  114. (defun emaketext  (textlay textnr textthk textpt10 textzg textro textkuan textqxie
  115.                    textcolor textstyle textlcr textdmh textpt11)
  116. ;|(emaketext textlay textnr textthk textpt10 textzg textro textkuan
  117. textqxie textcolor textstyle textlcr textdmh textpt11)|;
  118.   ;;用entmake方法添加文字注记实体
  119.   ;; textlay--注记图层  textnr---注记内容 textthk---注记厚值
  120.   ;; textzg---注记字高textro---注记旋转方向 textkuan---注记宽度系数
  121.   ;; textqxie---注记倾斜角度 textstyle---注记文字样式
  122.   ;; textcolor---注记颜色
  123.   ;; textlcr--注记左中右对齐方式(0,1,2,3,4,5,nil)
  124.   ;; textdmh--注记上中下对齐方式(3,2,1,nil)
  125.   ;; textpt10---注记点坐标10 textpt11---注记点坐标11
  126.   ;;(vla-get-alignment(vlax-ename->vla-object (car(entsel))))
  127.   (vl-load-com)
  128.   (setq        acadobject1   (vlax-get-acad-object)
  129.         acaddocument1 (vla-get-activedocument acadobject1)
  130.         mspace1              (vla-get-modelspace acaddocument1))
  131.   ;;注记位置textpt10和字高textzg
  132.   (setq textst_name nil)
  133.   (setq insertionpnt (vlax-make-safearray vlax-vbdouble '(0 . 2)))
  134.   (if (= (length textpt10) 2)
  135.     (setq textpt10 (list (nth 0 textpt10) (nth 1 textpt10) 0.0)))
  136.   (vlax-safearray-fill insertionpnt textpt10)
  137.   (setq textobj (vla-addtext mspace1 textnr insertionpnt textzg))
  138.   ;; textlcr--注记左中右对齐方式(0,1,2,3,4,5,nil)
  139.   ;; textdmh--注记上中下对齐方式(3,2,1,nil)
  140.   (cond
  141.     ;;基准线中1
  142.     ((and (= textlcr 1) (= textdmh nil)) (vla-put-alignment textobj acalignmentCenter))
  143.     ;;基准线右2
  144.     ((and (= textlcr 2) (= textdmh nil)) (vla-put-alignment textobj acalignmentRight))
  145.     ;;对齐3
  146.     ((and (= textlcr 3) (= textdmh nil)) (vla-put-alignment textobj acalignmentAligned))
  147.     ;;中央4
  148.     ((and (= textlcr 4) (= textdmh nil)) (vla-put-alignment textobj acalignmentMiddle))
  149.     ;;调整5
  150.     ((and (= textlcr 5) (= textdmh nil)) (vla-put-alignment textobj acalignmentFit))
  151.     ;;左上6
  152.     ((and (= textlcr 0) (= textdmh 3)) (vla-put-alignment textobj acalignmentTopLeft))
  153.     ;;中上7
  154.     ((and (= textlcr 1) (= textdmh 3)) (vla-put-alignment textobj acalignmentTopCenter))
  155.     ;;右上8
  156.     ((and (= textlcr 2) (= textdmh 3)) (vla-put-alignment textobj acalignmentTopRight))
  157.     ;;左中9
  158.     ((and (= textlcr 0) (= textdmh 2))
  159.      (vla-put-alignment textobj acalignmentMiddleLeft))
  160.     ;;中中10
  161.     ((and (= textlcr 1) (= textdmh 2))
  162.      (vla-put-alignment textobj acalignmentMiddleCenter))
  163.     ;;右中11
  164.     ((and (= textlcr 2) (= textdmh 2))
  165.      (vla-put-alignment textobj acalignmentMiddleRight))
  166.     ;;左下12
  167.     ((and (= textlcr 0) (= textdmh 1))
  168.      (vla-put-alignment textobj acalignmentBottomLeft))
  169.     ;;中下13
  170.     ((and (= textlcr 1) (= textdmh 1))
  171.      (vla-put-alignment textobj acalignmentBottomCenter))
  172.     ;;右下14
  173.     ((and (= textlcr 2) (= textdmh 1))
  174.      (vla-put-alignment textobj acalignmentBottomRight))
  175.     ;;默认基准线左0
  176.     (t (vla-put-alignment textobj acalignmentLeft)))
  177.   (if (or (/= textlcr nil) (/= textdmh nil))
  178.     (vla-put-textalignmentpoint textobj insertionpnt))
  179.   ;;注记颜色textcolor
  180.   (if (/= nil textcolor)
  181.     (vla-put-color textobj textcolor)
  182.     (vla-put-color textobj acbylayer))
  183.   ;;注记字型样式textstyle
  184.   (if (/= (type textstyle) nil)
  185.     (progn (if (and (/= textstyle (vla-get-stylename textobj))
  186.                     (/= (tblsearch "style" textstyle) nil))
  187.              (vla-put-stylename textobj textstyle))))
  188.   ;;注记厚度textthk
  189.   (if (and (/= (type textthk) 'REAL) (/= (type textthk) 'INT))
  190.     (setq textthk 0.0))
  191.   (vla-put-thickness textobj textthk)
  192.   ;;注记旋转角度textro
  193.   (if (/= nil textro)
  194.     (vla-put-rotation textobj textro)
  195.     (vla-put-rotation textobj 0.0))
  196.   ;;注记图层textlay
  197.   (if (= (tblsearch "layer" textlay) nil)
  198.     (progn (setq layersel (vla-get-layers acaddocument1))
  199.            (setq layerobj (vla-add layersel textlay))))
  200.   (vla-put-layer textobj textlay)
  201.   ;;注记的宽度系数textkuan
  202.   (if (/= textkuan nil)
  203.     (vla-put-ScaleFactor TextObj textkuan)
  204.     (vla-put-ScaleFactor TextObj 1.0))
  205.   ;;注记的倾斜系数textqxie
  206.   (if (/= textqxie nil)
  207.     (vla-put-ObliqueAngle TextObj textqxie)
  208.     (vla-put-ObliqueAngle TextObj 0.0))
  209.   ;;注记的扩展属性textkzsx
  210.   (setq textst_name (vlax-vla-object->ename TextObj))
  211.   textst_name)

好久不来了,长假休息期间来看看,顺便整理些源码供大家参考,希望对大家有帮助。
这段代码包含了以下几个功能
1 批量标注线段长度
2 对选择的线实体获取坐标列表
3 VLA-ADDTEXT方法添加注记实体时如何设置注记图层、颜色、字高、字宽、对齐方式等属性

本帖子中包含更多资源

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

x
发表于 2014-10-20 23:08 | 显示全部楼层
支持楼主更新,学习学习
发表于 2014-12-10 10:17 | 显示全部楼层
njcknfy 发表于 2014-10-7 15:10
好久不来了,长假休息期间来看看,顺便整理些源码供大家参考,希望对大家有帮助。
这段代码包含了以下几 ...

支持楼主   
你能给我看看这段代码吗?
我的功能是连接等高线,并使连接后的等高线进行拟合
先谢谢楼主了
(Defun C:cjlj1 (/ Ss1 ss2 Pt1 Pt2 p1 p2)
(vl-load-com)
  (Setvar "Cmdecho" 0)
    (Setq Pt1 (Getvar "Vsmin"))
    (Setq Pt2 (Getvar "Vsmax"))
    (Setq Ss1 (Entsel "\n 选择1线:"))
    (Setq Ss2 (Entsel "\n 选择2线:"))
    (Setq p1s (vlax-curve-getstartpoint (car ss1)))
    (Setq p1d (vlax-curve-getendpoint (car ss1)))
    (Setq p2d (vlax-curve-getendpoint (car ss2)))
    (Setq p2s (vlax-curve-getstartpoint (car ss2)))
    (setq Z1(car(assoc 38 (entget (car ss1)))))
    (setq Z2(car(assoc 38 (entget (car ss2)))))
(setq d1 (distance p1s p2s)
      d2 (distance p1s p2d)
      d3 (distance p1d p2s)
      d4 (distance p1d p2d)
)
(cond
    ((equal d1 (min d1 d2 d3 d4) 1e-5) (setq p1 p1s p2 p2s))
    ((equal d2 (min d1 d2 d3 d4) 1e-5) (setq p1 p1s p2 p2d))
    ((equal d3 (min d1 d2 d3 d4) 1e-5) (setq p1 p1d p2 p2s))
    (T (setq p1 p1d p2 p2d))
  )

(if (= z1 z2)
(progn
(Vl-Cmdf "pline" p1 p2 "")
(Vl-Cmdf ".Pedit" Ss1 "Yes" "J" "C" Pt1 Pt2 "" "")
(Vl-Cmdf ".Pedit" Ss1 "Yes" "s" Pt1 Pt2 "" "")
)
)
(Setvar "Cmdecho" 1)
(Princ)
)
发表于 2014-12-10 10:24 | 显示全部楼层
楼主什么时候还能来啊   
发表于 2015-6-30 08:47 | 显示全部楼层
好贴必须顶
发表于 2015-10-1 20:30 | 显示全部楼层
mrhvslisp 发表于 2011-5-9 09:24
楼主很厉害,
看下我这个,修改等高线的,楼主用CASS应该经常用到吧。
我自己尝试着写了点,但是效果不好 ...

能说说你的思路吗   
发表于 2015-10-1 20:32 | 显示全部楼层
004 发表于 2012-9-9 14:11
把cass重写了得了。每个人写一点,高手写点复杂的不就成了。。

好  提议    呵呵    权当练习了  呵呵
发表于 2015-12-26 20:01 | 显示全部楼层
njcknfy 发表于 2004-10-16 18:03
提供一段将LINE线转换为LWPOLYLINE的LSP原程序,大家交流交流

直接获取起点终点坐标,生成新的多断线,删除直线不就得了??
发表于 2015-12-27 09:53 | 显示全部楼层
支持………………
发表于 2016-1-11 23:44 | 显示全部楼层
楼主,能不能给一个批量刷房屋结构层数的lsp,做地籍时要在地籍-输入房屋结构层数里面去输很麻烦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 11:41 , Processed in 0.205477 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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