君是我的泪 发表于 2017-12-26 13:18:13

【已解决】cad里面怎么批量标注文字,字符串,例如“DN300,L1=”

本帖最后由 君是我的泪 于 2017-12-28 16:06 编辑

给定的自定义文字字符串,也可以用晓东工具集吗,不是长度标注,也是lisp吗?


marting 发表于 2017-12-28 12:18:13

君是我的泪 发表于 2017-12-28 10:54




LINE,POLYLINE,LWPOLYLINE,ARC,ELLIPSE,SPLINE,CIRCLE 都支持了。


(defun c:XDTB_PLSegLen (/ _process val)
(defun _process (e / is2d segs inx g v #angle #length #midpoint p1)
    (if (or (xdrx_object_isa e "AcDbSpline")
            (xdrx_object_isa e "AcDbEllipse")
            (xdrx_object_isa e "AcDbLine")
            (xdrx_object_isa e "AcDbArc")
            (xdrx_object_isa e "AcDbCircle")
      )
      (progn
      (setq #midpoint (xdrx_getpropertyvalue e "midpoint")
            #midpoint (if (xdrx_object_isa e "AcDbCircle")
                        (nth 1 (xdrx_getsamplept e 5))
                        #midpoint)
            #length   (xdrx_getpropertyvalue e "length")
            v         (xdrx_curve_getfirstderiv e #midpoint)
            #angle    (xdrx_vector_angle v)
            #angle    (xd::geom:angleformat #angle)
            p1      (trans (polar #midpoint
                                    (+ #angle (/ pi 2.0))
                                    (/ #txt_height 2.0)
                               )
                               e
                               0
                        )
      )
      (xdrx_text_make p1
                        (strcat "DL300,L1=" (rtos #length 2 #txt_bit))
                        (getvar "textstyle")
                        #txt_height
                        #angle
      )
      (xd::text:setalignment (entlast) p1 "BC")
      )
      (progn
      (if (xdrx_object_isa e "AcDb2dPolyline")
          (progn
            (setq is2d t e (xdrx_entity_copy e))
            (xdrx_polyline_convertfrom e)
          )
      )
      (setq segs (xdrx_polyline_numverts e))
      (setq inx 0)
      (repeat segs
          (if (setq g (xdrx_polyline_getlinesegat e inx t))
            (progn
            (xdge::getpropertyvalue g "length" "midpoint" "angle")
            )
            (progn (setq g (xdrx_polyline_getarcsegat e inx t))
                   (xdge::getpropertyvalue g "length" "midpoint")
                   (setq v      (xdrx_curve_getfirstderiv e #midpoint)
                         #angle (xdrx_vector_angle v)
                   )
            )
          )
          (setq #angle (xd::geom:angleformat #angle)
                p1   (trans (polar #midpoint
                                     (+ #angle (/ pi 2.0))
                                     (/ #txt_height 2.0)
                              )
                              e
                              0
                     )
          )
          (xdrx_text_make p1
                        (strcat "DL300,L1=" (rtos #length 2 #txt_bit))
                        (getvar "textstyle")
                        #txt_height
                        #angle
          )
          (xd::text:setalignment (entlast) p1 "BC")
          (setq inx (1+ inx))
      )
      (xdge::free g)
      (if is2d
          (xdrx_entity_delete e)
      )
      )
    )
)
(if (not #txt_height)
    (setq #txt_height 3.5)
)
(if (not #txt_bit)
    (setq #txt_bit 1)
)
(if (setq val (getint (xdrx_prompt "\n保留位数<" #txt_bit ">:" t)))
    (setq #txt_bit val)
)
(if (setq val (getreal (xdrx_prompt "\n字高<" #txt_height ">:" t)))
    (setq #txt_height val)
)
(xdrx_begin)
(xdrx_sysvar_push '("dimzin" 0))
(while
    (and (xdrx_initssget "\n选择线、多段线<退出>:")
         (setq ss (xdrx_ssget
                  '((0 . "line,*POLYLINE,ellipse,arc,spline,circle"))
                  )
         )
    )
   (xd::text:init 1)
   (mapcar '(lambda (x) (_process x)) (xdrx_pickset->ents ss))
)
(xdrx_sysvar_pop)
(xdrx_end)
(princ)
)


marting 发表于 2017-12-27 16:47:13

君是我的泪 发表于 2017-12-27 15:12


LINE也可以了


(defun c:XDTB_PLSegLen (/ _process val)
(defun _process (e / segs inx g v #angle #length #midpoint p1)
    (if        (xdrx_object_isa e "AcDbLine")
      (progn (setq isLINE t
                   e          (xdrx_polyline_make (xdrx_getsamplept e))
             )
      )
    )
    (setq segs (xdrx_polyline_numverts e))
    (setq inx 0)
    (repeat segs
      (if (setq g (xdrx_polyline_getlinesegat e inx t))
        (progn
          (xdge::getpropertyvalue g "length" "midpoint" "angle")
        )
        (progn (setq g (xdrx_polyline_getarcsegat e inx t))
             (xdge::getpropertyvalue g "length" "midpoint")
             (setq v          (xdrx_curve_getfirstderiv e #midpoint)
                     #angle (xdrx_vector_angle v)
             )
        )
      )
      (setq #angle (xd::geom:angleformat #angle)
          p1           (trans
                     (polar #midpoint (+ #angle (/ pi 2.0)) (/ #txt_height 2.0))
                     e
                     0
                   )
      )
      (xdrx_text_make
        p1
        (strcat "DL300,L1=" (rtos #length 2 #txt_bit))
        (getvar "textstyle")
        #txt_height
        #angle
      )
      (xd::text:setalignment (entlast) p1 "BC")
      (setq inx (1+ inx))
    )
    (xdge::free g)
    (if        isLine
      (xdrx_entity_delete e)
    )
)
(if (not #txt_height)
    (setq #txt_height 3.5)
)
(if (not #txt_bit)
    (setq #txt_bit 1)
)
(if (setq val (getint (xdrx_prompt "\n保留位数<" #txt_bit ">:" t)))
    (setq #txt_bit val)
)
(if (setq val (getreal (xdrx_prompt "\n字高<" #txt_height ">:" t)))
    (setq #txt_height val)
)
(xdrx_begin)
(xdrx_sysvar_push '("dimzin" 0))
(if (and (xdrx_initssget "\n选择线、多段线<退出>:")
           (setq ss (xdrx_ssget '((0 . "line,LWPOLYLINE"))))
      )
    (progn (xd::text:init 1)
           (mapcar '(lambda (x) (_process x)) (xdrx_pickset->ents ss))
    )
)
(xdrx_sysvar_pop)
(xdrx_end)
(princ)
)


marting 发表于 2017-12-26 13:45:39


[*]多搜索论坛,用 多段线 标注 做关键字。


[*]批量标注多段线各段长度(支持弧线)15 个回复 - 616 次查看有朋友求助这个,http://bbs.xdcad.net/thread-711444-1-1.html2017-8-6 10:09 - newer - 每日插件
[*]折线(多段线)标注59 个回复 - 1003 次查看1、间距,界线的长度按实际出图希望的数值定。在基准比例下。 比如,米单位绘图,希望出图后界线长度1厘米,那么长度设置为10, 毫米单位绘图,长度设置为1000. 2、不用考虑出图比例,各种比例程序都能处理,保证 ...2016-6-30 09:16 - newer - 每日插件
[*]标注多段线各边长度及夹角29 个回复 - 157 次查看函数 mr_IsPointInside: **** 本内容被作者隐藏 ****2017-7-25 11:35 - Lisphk - A/VLISP
[*]在多段线上拖动标注文字

君是我的泪 发表于 2017-12-26 14:01:25

marting 发表于 2017-12-26 13:45


这是标注 某一特定的自定文字,不是标注长度

marting 发表于 2017-12-26 14:26:57

君是我的泪 发表于 2017-12-26 14:01


都是在多段线上标字,你改下代码里面的标注的内容不就行了,程序框架是一样的。

再说了,你这样发帖,不好帮你,一是你图片看不清,另外你想怎么标,文字和多段线什么关系等等都没有说明。

如果你想要帮你写个,去编程申请论坛,把你的详细条件都说清楚,截图醒目些,然后传个DWG压缩文件供测试。

Lisphk 发表于 2017-12-26 14:38:58

你DN300,L1=等号后面不是还有每段的长度吗?


上面的程序标注出长度,你在程序代码里面找到写文字的部分,前面加上字符串 DN300,L就行了。


你这些文字要是变化的就得改程序了。

君是我的泪 发表于 2017-12-27 08:47:39

怎么改?批量标注Line及Pline各段长度.LSP

(defun c:XDTB_Dimlines (/ ss e pts an dm)
(defun mkrotate (p1 p2 p3 an / dm)
    (setq dm (xdrx_dimension_makerotate p1 p2 p3 an))
    (mapcar '(lambda (x) (xdrx_setpropertyvalue dm x t))
   '("Dimsd1" "Dimsd2" "Dimse1" "Dimse2")
    )
)
(if (setq ss (ssget '((0 . "*polyline,line"))))
    (progn
      (xd::begin)
      (xdrx_setsstodb ss 0)
      (while (setq e (xdrx_getentdata 0))
(if (= (xdrx_getpropertyvalue e "IsA") "AcDbLine")
   (progn (setq pts (xdrx_curve_getpoint e)
         an(xdrx_getpropertyvalue e "Angle")
   )
   (mkrotate (car pts) (last pts) (cadr pts) an)
   )
   (progn
   (setq pts (xdrx_entity_getstretchpoint e))
   (mapcar
       '(lambda (p1 p2 / d pcen midp)
   (if (zerop (xdrx_polyline_getbulgeat
         e
         (fix (xdrx_curve_getparamatpoint e p1))
       )
       )
   (mkrotate p1 p2 (xdrx_line_midp p1 p2) (angle p1 p2))
   (progn
       (setq d (xdrx_curve_getdistatpoint e p1 p2)
      pcen (cadr
      (xdrx_polyline_getArcSegAt
      e
      (fix (xdrx_curve_getparamatpoint e p1))
      )
    )
      midp (xdrx_curve_getpointatparam
      e
      (/ (+ (xdrx_curve_getparamatpoint e p1)
   (xdrx_curve_getparamatpoint e p2)
         )
         2.
      )
    )
      dm (xdrx_dimension_make2lang
      pcen p1 pcen p2 midp)
       )
       (mapcar '(lambda (x) (setpropertyvalue dm x t))
      '("Dimsd1" "Dimsd2" "Dimse1" "Dimse2")
       )
       (xdrx_setpropertyvalue dm "Dimtext" (rtos d 2 2))
   )
   )
      )
       pts
       (cdr pts)
   )
   )
)
      )
      (xd::end)
    )
)
(princ)
)

newer 发表于 2017-12-27 09:26:27

君是我的泪 发表于 2017-12-27 08:47


改什么啊? 你说下规则啊,什么字改成什么?

君是我的泪 发表于 2017-12-27 11:59:25

newer 发表于 2017-12-27 09:26


每条直线,多段线标注特定“自定义”字符例如:"DN300,L1="修改以上代码,以上代码是标注长度的,能既标注特定字符,又标注长度更好

marting 发表于 2017-12-27 12:13:49

君是我的泪 发表于 2017-12-27 11:59


找这行代码

(xdrx_setpropertyvalue dm "Dimtext" (rtos d 2 2))

改成:

(xdrx_setpropertyvalue dm "Dimtext"(strcat "DN300,L1=" (rtos d 2 2)))

君是我的泪 发表于 2017-12-27 13:41:49

本帖最后由 君是我的泪 于 2017-12-27 13:50 编辑

marting 发表于 2017-12-27 12:13

不对的,只标注了长度,和原来是一样的,没那么简单吧

marting 发表于 2017-12-27 14:20:40

君是我的泪 发表于 2017-12-27 13:41


你找的代码,并不是最好的

批量标注多段线各段长度(支持弧线)拿这个改


支持弧线段






(defun c:XDTB_PLSegLen (/ _process val)
(defun _process (e / segs inx g v #angle #length #midpoint p1)
    (setq segs (xdrx_polyline_numverts e))
    (setq inx 0)
    (repeat segs
      (if (setq g (xdrx_polyline_getlinesegat e inx t))
      (progn
          (xdge::getpropertyvalue g "length" "midpoint" "angle")
      )
      (progn
          (setq g (xdrx_polyline_getarcsegat e inx t))
          (xdge::getpropertyvalue g "length" "midpoint")
          (setq v (xdrx_curve_getfirstderiv e #midpoint)
                #angle (xdrx_vector_angle v))
      )
      )
      (setq #angle (xd::geom:angleformat #angle)
            p1         (trans (polar #midpoint
                                 (+ #angle (/ pi 2.0))
                                 (/ #txt_height 2.0))
                                 e
                                 0
                        )
                   )
      (xdrx_text_make
      p1
      (strcat "DL300,L1=" (rtos #length 2 #txt_bit))
      (getvar "textstyle")
      #txt_height
      #angle
      )
      (xd::text:setalignment (entlast) p1 "BC")
      (setq inx (1+ inx))
    )
    (xdge::free g)
)
(if (not #txt_height)
    (setq #txt_height 3.5)
)
(if (not #txt_bit)
    (setq #txt_bit 1)
)
(if (setq val (getint (xdrx_prompt "\n保留位数<" #txt_bit ">:" t)))
    (setq #txt_bit val)
)
(if (setq val (getreal (xdrx_prompt "\n字高<" #txt_height ">:" t)))
    (setq #txt_height val)
)
(xdrx_begin)
(xdrx_sysvar_push '("dimzin" 0))
(if (and (xdrx_initssget "\n选择多段线<退出>:")
         (setq ss (xdrx_ssget '((0 . "LWPOLYLINE"))))
      )
    (progn
      (xd::text:init 1)
      (mapcar '(lambda (x) (_process x)) (xdrx_pickset->ents ss))
    )
)
(xdrx_sysvar_pop)
(xdrx_end)
(princ)
)

君是我的泪 发表于 2017-12-27 15:12:41

本帖最后由 君是我的泪 于 2017-12-27 15:15 编辑

marting 发表于 2017-12-27 14:20

貌似只能选择多段线,怎么改一下,能选择直线,还要用pedit合并

marting 发表于 2017-12-27 16:38:19

君是我的泪 发表于 2017-12-27 15:12


搜索论坛   线变复线 或者连接

工具是组合用的。

君是我的泪 发表于 2017-12-28 10:54:55

marting 发表于 2017-12-27 16:47


arc弧线行吗?要pedit,样条曲线spline 可以吗?要转化为多段线?
页: [1] 2
查看完整版本: 【已解决】cad里面怎么批量标注文字,字符串,例如“DN300,L1=”