o宠虫飞/;!★ 发表于 2014-5-13 12:00:25

多线段标注

本帖最后由 o宠虫飞/;!★ 于 2014-5-13 12:22 编辑


多线段标注 要求字头统一朝上或朝左,而且在线内侧如图,怎么用程序实现?标注是好实现就是字头的方向和在线内的情况我搞不定,求高人指点,谢谢!!

ysq101 发表于 2014-5-13 12:22:00

这个不算很难啊。。。自己找找   关于多线段

o宠虫飞/;!★ 发表于 2014-5-13 12:24:13

关键是 字头的方向和在线内,而且线的方向是不固定的!

lucas_3333 发表于 2014-5-13 12:34:53

(defun c:pdim(/ plSet pLlst vLst oldOsn cAng cDis cPt)
(princ "\n<<< Select LwPolyline for dimensioning >>> ")
(if(setq plSet(ssget '((0 . "LWPOLYLINE"))))
    (progn
      (setq pLlst(vl-remove-if 'listp
                         (mapcar 'cadr(ssnamex plSet)))
          oldOsn(getvar "OSMODE")
          ); end if
      (setvar "OSMODE" 0)(setvar "CMDECHO" 0)
      (command "_.undo" "_be")
      (foreach pl pLlst
        (setq vLst(mapcar '(lambda(x)
                   (trans x 0 1))(mapcar 'cdr
                     (vl-remove-if-not
                     '(lambda(x)(= 10(car x)))(entget pl))))
              ); end setq
        (if(equal '(70 . 1)(assoc 70(entget pl)))
          (setq vLst(append vLst(list(car vLst))))
          ); end if
        (while(< 1(length vLst))
          (setq cAng(angle(car vLst)(cadr vLst))
                cDis(/(distance(car vLst)(cadr vLst))2))
          (if(>=(caar vLst)(caadr vLst))
          (setq cAng(- cAng pi))
          ); end if
          (setq cPt(polar
                     (polar(car vLst)cAng cDis)
                     (+ cAng(* 0.5 pi))(* 1.0(getvar "DIMTXT")))
                ); end setq
          (command "_.dimaligned"(car vLst)(cadr vLst) cPt)
          (setq vLst(cdr vLst))
          ); end while
        ); end foreach
      (command "_.undo" "_e")
      (setvar "OSMODE" oldOsn)(setvar "CMDECHO" 1)
      ); end progn
    ); end if
(princ)
); end of c:pdim

动手修该一下吧

o宠虫飞/;!★ 发表于 2014-5-13 14:12:49

标注倒是好上就是调整位置,感谢提供方法可是没达到效果。

byghbcx 发表于 2014-5-13 15:23:35

稍微改了一下
(defun c:pdim(/ plSet pLlst vLst oldOsn cAng cDis cPt cen per)
(princ "\n<<< Select LwPolyline for dimensioning >>> ")
(if(setq plSet(ssget '((0 . "LWPOLYLINE"))))
    (progn
      (setq pLlst(vl-remove-if 'listp
                   (mapcar 'cadr(ssnamex plSet)))
          oldOsn(getvar "OSMODE")
          ); end if
      (setvar "OSMODE" 0)
      (setvar "CMDECHO" 0)
      (command "_.undo" "_be")
      (foreach pl pLlst
        (setq vLst(mapcar '(lambda(x)
                             (trans x 0 1))
                          (mapcar 'cdr
                                  (vl-remove-if-not
                                  '(lambda(x)(= 10(car x)))(entget pl))))
              ); end setq
        (if(equal '(70 . 1)(assoc 70(entget pl)))
          (setq vLst(append vLst(list(car vLst))))
          ); end if
        (setq cen(list (/ (apply '+ (mapcar 'car vLst)) (length vLst))
                       (/ (apply '+ (mapcar 'cadr vLst)) (length vLst))
                       (/ (apply '+ (mapcar 'caddr vLst)) (length vLst)))
              )
        (while(< 1(length vLst))
          (setq cAng(angle(car vLst)(cadr vLst))
                cDis(/(distance(car vLst)(cadr vLst))2))
;;;          (if(>=(caar vLst)(caadr vLst))
;;;          (setq cAng(- cAng pi))
;;;          ); end if
          (setq cPt(polar
                     (setq cmid (polar(car vLst)cAng cDis))
                     (angle cmid cen) (* 2.0(getvar "DIMTXT")))
                ); end setq
          ;(command "_.dimaligned"(car vLst)(cadr vLst) cPt)
          (setq per (inters cen (polar cen (- cAng (* 0.5 pi)) 1) (car vLst) (cadr vLst) nil))          
          (command "_.text" cPt (* 2.0(getvar "DIMTXT")) (/ (* 180 (- (angle per cen) (* 0.5 pi))) pi) (rtos (distance(car vLst)(cadr vLst)) 2 2) )
          (setq vLst(cdr vLst))
          ); end while
        ); end foreach
      (command "_.undo" "_e")
      (setvar "OSMODE" oldOsn)(setvar "CMDECHO" 1)
      ); end progn
    ); end if
(princ)
); end of c:pdim

edata 发表于 2014-5-13 17:02:34

(defun c:tt(/ ANG1 ANG2 ANG3 ANG4 CEN DS12 DS23 DS34 DS41 ENT LL LST M12 M23 M34 M41 OBJ P1 P2 P3 P4 RR SS X Y)
;;返回多段线顶点表
(defun vertexs (ename / plist pp n)      
(setq obj (vlax-ename->vla-object ename))
(setq plist (vlax-safearray->list
(vlax-variant-value
    (vla-get-coordinates obj))))
(setq n 0)
(repeat (/ (length plist) 2)
    (setq pp (append pp (list (list (nth n plist)(nth (1+ n) plist)))))
    (setq n (+ n 2))
)
pp
)
(if(setq ss(ssget '((0 . "lwpolyline") (90 . 4)(70 . 1))))          
    (while (setq ent(ssname ss 0))
      (progn
      (setq lst(vertexs ent)
          p1(car lst)
          p2(cadr lst)
          p3(caddr lst)
          p4(cadddr lst)
          ll(apply 'mapcar (list 'min p1 p2 p3 p4))
          rr(apply 'mapcar (list 'max p1 p2 p3 p4))
          p1 ll
          p3 rr
          p2 (list(car p3)(cadr p1))
          p4 (list(car p1)(cadr p3))
          cen(mapcar '(lambda(x y)(* (+ x y) 0.5)) p1 p3)
          m12(mapcar '(lambda(x y)(* (+ x y) 0.5)) p1 p2)
          m23(mapcar '(lambda(x y)(* (+ x y) 0.5)) p2 p3)
          m34(mapcar '(lambda(x y)(* (+ x y) 0.5)) p3 p4)
          m41(mapcar '(lambda(x y)(* (+ x y) 0.5)) p4 p1)
          ds12(distance p1 p2)
          ds23(distance p2 p3)
          ds34(distance p3 p4)
          ds41(distance p4 p1)
          ang1 0
          ang2 (* 0.5 pi)
          ang3 0
          ang4 (* 0.5 pi)          
          )
      (entmake (list '(0 . "TEXT")'(72 . 1)(cons 73 1)(cons 50 ang1) (cons 1 (rtos ds12 2 2)) (cons 10 m12)(cons 11 m12) (cons 40 (* ds12 0.025))))
      (entmake (list '(0 . "TEXT")'(72 . 1)(cons 73 1)(cons 50 ang2) (cons 1 (rtos ds23 2 2)) (cons 10 m23)(cons 11 m23) (cons 40 (* ds12 0.025))))
      (entmake (list '(0 . "TEXT")'(72 . 1)(cons 73 3)(cons 50 ang3)(cons 1 (rtos ds34 2 2)) (cons 10 m34)(cons 11 m34) (cons 40 (* ds12 0.025))))
      (entmake (list '(0 . "TEXT")'(72 . 1)(cons 73 3)(cons 50 ang4) (cons 1 (rtos ds41 2 2)) (cons 10 m41)(cons 11 m41) (cons 40 (* ds12 0.025))))      
      )
      (setq ss(ssdel ent ss))
    )
    )
(princ)
)

lucas_3333 发表于 2014-5-13 17:08:06

edata 发表于 2014-5-13 17:02 static/image/common/back.gif


E大,这个只能标矩形吧

香田里浪人 发表于 2014-5-13 17:21:55

;;;多义线边长标注
(defun c:bcbz (/ obj pianju sHandlept np gx bj np xcrrcp n ang1 zjp ms AddText pen-n pen-all)
;;;构造text
(command "layer" "M" "边长标注" "C" "6" "" "LT" "CONTINUOUS" "" "");设置一个标注图层
(command "style" "hz" "宋体" "0" "" "0" "" "")
(setvar"dimzin"0);;保留小数位数时如果位数不足可以补零
(defun AddText (obj TextStringInsertionPointHeight xz kb qx Alignment style / obj1 err)
(setq obj1 (vla-addtext obj TextString(vlax-3d-point InsertionPoint)Height))
(vla-put-Rotation obj1 xz)
(vla-put-ScaleFactor obj1 kb)
(vla-put-ObliqueAngle obj1 qx)
(vla-put-alignment obj1 Alignment)
(if (/= Alignment acAlignmentLeft)
    (vla-put-TextAlignmentPoint obj1 (vlax-3d-point InsertionPoint))
    (vla-put-InsertionPoint obj1 (vlax-3d-point InsertionPoint))
   )
   (VL-CATCH-ALL-APPLY 'vla-put-StyleName (list obj1 style))
obj1
)
(setq pi2 (/ pi 2))
(setq ms (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
(setqbcHeight (getdist "\n输入标注文字高度:");文字高度
      kgb         0.60 ; 宽高比
      DimScale 1 ; 边长尺度,若单位为mm,该值为1000
      flag      nil;nil标注在多段线走向的右侧,T 左侧
) ;_ setq
(setq pen-n 0)
(if (setq pen-all (ssget '((0 . "*polyline"))))
    (repeat (sslength pen-all)
            (setq pianju (* bcHeight 0.7)) ;边长离线距离
            (setq pen-en (ssname pen-all pen-n))
            (setq obj (vlax-ename->vla-object pen-en)
                  n 0)
            (while (and (setq pt (vlax-curve-getPointAtParam obj n))
            (setq np (vlax-curve-getPointAtParam obj (1+ n)))
         ) ;_ 结束and
    (if      (/= 0.0 (setq bugle (vla-GetBulge obj n)))
      (progn
      (setq midpt (vlax-curve-getPointAtParam obj (+ 0.5 n))
             bj (* (atan (abs bugle)) 4)
            xc (* 0.5 (distance Pt np))
            gg (abs (* bugle xc))
            rr (/ (+ (* xc xc) (* gg gg)) (* 2 gg))
            ang1 (angle pt np)
            cp (polar Pt ang1 xc)
            cp (polar midpt (angle midpt cp) rr)
            bc (rtos (/ (- (vlax-curve-getDistAtParam obj (1+ n)) (vlax-curve-getDistAtParam obj n)) DimScale) 2 2)
            )
       (if flag
            (setq zjp (polar midpt (cond ((> bugle 0)(angle midpt cp))(t (anglecp midpt))) pianju))
            (setq zjp(polar midpt (cond ((> bugle 0)(anglecp midpt))(t (angle midpt cp))) pianju))
   )
      (if (not (or (and (>= ang1 0) (< ang1 (* 0.666666 pi))) (and (> ang1 (* 1.666666 pi)) (< ang1 (* 2.0 pi)))))
         (setq ang1 (- ang1 pi))
          )
      (AddText ms bczjpbcHeight ang1 kgb 0 acAlignmentMiddle Style)
   );progn
      (progn
      (setq midpt (vlax-curve-getPointAtParam obj (+ 0.5 n))
            ang1 (angle pt np)
            bc (rtos (/ (- (vlax-curve-getDistAtParam obj (1+ n)) (vlax-curve-getDistAtParam obj n)) DimScale)2 2)
            )
      (if flag
            (setq zjp (polar midpt (+ pi2 ang1) pianju))
          (setq zjp (polar midpt (- ang1 pi2) pianju))
               )
      (if (not (or (and (>= ang1 0) (< ang1 (* 0.666666 pi))) (and (> ang1 (* 1.666666 pi)) (<= ang1 (* 2.0 pi)))))
          (setq ang1 (- ang1 pi))
          )
      (AddText ms bczjpbcHeight ang1 kgb 0 acAlignmentMiddle Style)
      );progn
    ) ;结束if
    (setq n (1+ n))
) ; 结束while
(setq pen-n (1+ pen-n)))
)
(princ)
)

bai2000 发表于 2014-5-13 19:51:16

楼上,能不能改下,对直线也适用?
页: [1] 2
查看完整版本: 多线段标注