hhaoma 发表于 2014-8-28 18:23:50

Atsai 发表于 2014-8-28 16:55 static/image/common/back.gif
功能类似是这样的吧, 目前只能改到这样!

高手啊!求代码~

hhaoma 发表于 2014-8-28 18:24:47

Atsai 你真厉害啊!有代码不?能教教我吗?

Atsai 发表于 2014-8-28 21:57:03

我是利用下面的源码改的!
有点长,如果看得懂,应该就有办法改。;-------------------------------------------------------------------------------
; Program Name: DPL - Dimension Polylines
; Created By:   Terry Miller (Email: terrycadd@yahoo.com)
;               (URL: http://web2.airmail.net/terrycad)
; Date Created: 5-20-08
; Function:   Dimensions Polyline shapes
;-------------------------------------------------------------------------------
; Revision History
; RevBy   Date    Description
;-------------------------------------------------------------------------------
; 1    TM   5-20-08   Initial version
;-------------------------------------------------------------------------------
; c:DPL - Dimensions Polyline
;-------------------------------------------------------------------------------
(defun c:DPL (/ EntName^ EntPick@)
(setvar "CMDECHO" 0)
(if (setq EntPick@ (entsel "\nSelect Polyline to dimension: "))
    (if (= (cdr (assoc 0 (entget (car EntPick@)))) "LWPOLYLINE")
      (progn
      (setq EntName^ (cdr (assoc -1 (entget (car EntPick@)))))
      (DimPL EntName^)
      );progn
    );if
);if
(if (not EntName^)
    (princ "\nNo Polyline selected.")
);if
(princ)
);defun c:DPL
;-------------------------------------------------------------------------------
; DimPL - Function to dimension Polyline
; Arguments: 1
;   EntName^ = Polyline entity name
; Returns: Dimensions Polyline
;-------------------------------------------------------------------------------
(defun DimPL (EntName^ / Bottom@ Clayer$ CW# DiffAng DimPts: DimSpace~ EntList@
Item LastAng~ LastPt Left@ List@ NW@ Osmode# P0 P1 P2 Pt Pts@ PtsLen Right@ SE@
Top@ X~ X1~ X1Y1 X1Y2 X1Ys@ X2~ X2Y1 X2Y2 X2Ys@ XPts@ Y~ Y1~ Y1X1 Y1X2 Y1Xs@ Y2~
Y2X1 Y2X2 Y2Xs@ YPts@)
;-----------------------------------------------------------------------------
(defun DimPts: (Pts@ StartPt EndPt Type$ / Add Num1~ Num2~ Nums1@ Nums2@ P1 P2
    Pt Return@)
    (setq Add t)
    (foreach Pt (member StartPt (append Pts@ Pts@))
      (if Add
      (setq Return@ (append Return@ (list Pt)))
      );if
      (if (equal Pt EndPt)
      (setq Add nil)
      );if
    );foreach
    (foreach Pt Return@
      (if (member Type$ (list "Left" "Right"))
      (setq Nums1@ (append Nums1@ (list (cadr Pt))))
      (setq Nums1@ (append Nums1@ (list (car Pt))))
      );if
    );foreach
    (foreach Num1~ (vl-sort Nums1@ '<)
      (setq Nums2@ nil)
      (foreach Pt Return@
      (if (member Type$ (list "Left" "Right"))
          (if (= (cadr Pt) Num1~)
            (setq Nums2@ (append Nums2@ (list (car Pt))))
          );if
          (if (= (car Pt) Num1~)
            (setq Nums2@ (append Nums2@ (list (cadr Pt))))
          );if
      );if
      );foreach
      (if (member Type$ (list "Left" "Bottom"))
      (setq Nums2@ (vl-sort Nums2@ '<))
      (setq Nums2@ (reverse (vl-sort Nums2@ '<)))
      );if
      (foreach Num2~ (cdr Nums2@)
      (if (member Type$ (list "Left" "Right"))
          (setq Pt (list Num2~ Num1~))
          (setq Pt (list Num1~ Num2~))
      );if
      (setq Return@ (vl-remove Pt Return@))
      );foreach
    );foreach
    (cond
      ((= Type$ "Left")
      (vl-sort Return@ (function (lambda (P1 P2)(< (cadr P1)(cadr P2)))))
      );case
      ((= Type$ "Top")
      (vl-sort Return@ (function (lambda (P1 P2)(< (car P1)(car P2)))))
      );case
      ((= Type$ "Right")
      (vl-sort Return@ (function (lambda (P1 P2)(> (cadr P1)(cadr P2)))))
      );case
      ((= Type$ "Bottom")
      (vl-sort Return@ (function (lambda (P1 P2)(> (car P1)(car P2)))))
      );case
    );cond
);defun DimPts:
;-----------------------------------------------------------------------------
(setq EntList@ (entget EntName^))
(if (= (cdr (assoc 0 EntList@)) "LWPOLYLINE")
    (progn
      (foreach List@ EntList@
      (if (= (car List@) 10)
          (if (not (equal (cdr List@) LastPt))
            (progn
            (setq Pts@ (append Pts@ (list (cdr List@))))
            (if (> (length Pts@) 2)
                (if (/= (angle LastPt (cdr List@)) LastAng~) (setq DiffAng t))
            );if
            (if (> (length Pts@) 1)
                (setq LastAng~ (angle LastPt (cdr List@)))
            );if
            (setq LastPt (cdr List@))
            );progn
          );if
      );if
      );foreach
      (if (equal (car Pts@) (last Pts@))
      (setq Pts@ (reverse (cdr (reverse Pts@))))
      );if
      (setq PtsLen (length Pts@))
    );progn
    (exit)
);if
(foreach Pt Pts@
    (setq X~ (atof (rtos (car Pt) 2 8))
          Y~ (atof (rtos (cadr Pt) 2 8))
          XPts@ (append XPts@ (list X~))
          YPts@ (append YPts@ (list Y~))
          Pts@ (cdr (append Pts@ (list (list X~ Y~))))
    );setq
);foreach
(setq XPts@ (vl-sort XPts@ '<)
      YPts@ (vl-sort YPts@ '<)
      X1~ (car XPts@)
      X2~ (last XPts@)
      Y1~ (car YPts@)
      Y2~ (last YPts@)
);if
(foreach Pt Pts@
    (if (= (car Pt) X1~) (setq X1Ys@ (append X1Ys@ (list (cadr Pt)))))
    (if (= (car Pt) X2~) (setq X2Ys@ (append X2Ys@ (list (cadr Pt)))))
    (if (= (cadr Pt) Y1~) (setq Y1Xs@ (append Y1Xs@ (list (car Pt)))))
    (if (= (cadr Pt) Y2~) (setq Y2Xs@ (append Y2Xs@ (list (car Pt)))))
);foreach
(setq X1Ys@ (vl-sort X1Ys@ '<)
      X2Ys@ (vl-sort X2Ys@ '<)
      Y1Xs@ (vl-sort Y1Xs@ '<)
      Y2Xs@ (vl-sort Y2Xs@ '<)
      X1Y1 (list X1~ (car X1Ys@))
      X1Y2 (list X1~ (last X1Ys@))
      X2Y1 (list X2~ (car X2Ys@))
      X2Y2 (list X2~ (last X2Ys@))
      Y1X1 (list (car Y1Xs@) Y1~)
      Y1X2 (list (last Y1Xs@) Y1~)
      Y2X1 (list (car Y2Xs@) Y2~)
      Y2X2 (list (last Y2Xs@) Y2~)
      Pts@ (member X1Y1 (append Pts@ Pts@))
);setq
(while (> (length Pts@) PtsLen)
    (setq Pts@ (reverse (cdr (reverse Pts@))))
);while
(setq SE@ (member X2Y2 Pts@) NW@ Pts@)
(foreach Item SE@
    (setq NW@ (vl-remove Item NW@))
);foreach
(setq SE@ (append SE@ (list X1Y1))
      NW@ (append NW@ (list X2Y2))
      CW# 0
);setq
(foreach Pt (list Y2X1 Y2X2)
    (if (member Pt NW@) (setq CW# (1+ CW#)))
    (if (member Pt SE@) (setq CW# (1- CW#)))
);foreach
(foreach Pt (list Y1X1 Y1X2)
    (if (member Pt SE@) (setq CW# (1+ CW#)))
    (if (member Pt NW@) (setq CW# (1- CW#)))
);foreach
(if (< CW# 0)
    (setq Pts@ (append (list (car Pts@))(reverse (cdr Pts@))))
);if
(setq Left@ (DimPts: Pts@ Y1X1 Y2X1 "Left"))
(setq Top@ (DimPts: Pts@ X1Y2 X2Y2 "Top"))
(setq Right@ (DimPts: Pts@ Y2X2 Y1X2 "Right"))
(setq Bottom@ (DimPts: Pts@ X2Y1 X1Y1 "Bottom"))
;-----------------------------------------------------------------------------
(command "UNDO" "BEGIN")
(setq DimSpace~ (* (getvar "DIMSCALE") (getvar "DIMTXT") 3))
(setq Osmode# (getvar "OSMODE")) (setvar "OSMODE" 0)
(setq Clayer$ (getvar "CLAYER"))
(command "LAYER" "S" (GetDimLayer) "");<--Change to your Dim layer info
(setq P0 (polar X1Y1 pi (* DimSpace~ 1.5))
      P1 (car Left@)
);setq
(foreach P2 (cdr Left@)
    (command "DIM1" "VER" P1 P2 P0 "")
    (setq P1 P2)
);foreach
(if (> (length Left@) 2)
    (progn
      (setq P0 (polar P0 pi DimSpace~))
      (command "DIM1" "VER" (car Left@) (last Left@) P0 "")
    );progn
);if
(setq P0 (polar Y2X1 (* pi 0.5) (* DimSpace~ 1.5))
      P1 (car Top@)
);setq
(foreach P2 (cdr Top@)
    (command "DIM1" "HOR" P1 P2 P0 "")
    (setq P1 P2)
);foreach
(if (> (length Top@) 2)
    (progn
      (setq P0 (polar P0 (* pi 0.5) DimSpace~))
      (command "DIM1" "HOR" (car Top@) (last Top@) P0 "")
    );progn
);if
(setq P0 (polar X2Y2 0 (* DimSpace~ 1.5))
      P1 (car Right@)
);setq
(if (and (> (length Right@) 2) DiffAng)
    (foreach P2 (cdr Right@)
      (command "DIM1" "VER" P1 P2 P0 "")
      (setq P1 P2)
    );foreach
);if
(setq P0 (polar Y1X2 (* pi 1.5) (* DimSpace~ 1.5))
      P1 (car Bottom@)
);setq
(if (and (> (length Bottom@) 2) DiffAng)
    (foreach P2 (cdr Bottom@)
      (command "DIM1" "HOR" P1 P2 P0 "")
      (setq P1 P2)
    );foreach
);if
(setvar "CLAYER" Clayer$)
(setvar "OSMODE" Osmode#)
(command "UNDO" "END")
(princ)
);defun DimPL
;-------------------------------------------------------------------------------
; GetDimLayer - Returns the layer name that's on and has the most dimensions,
; or the current layer name if there's no dimensions.
;-------------------------------------------------------------------------------
(defun GetDimLayer (/ DimLayer$ EntList@ Index# Layer$ LayerInfo@ LayerList@ List@ Num# SS&)
(setq Layer$ (getvar "CLAYER"))
(if (setq SS& (ssget "X" '((0 . "DIMENSION"))))
    (progn
      (setq Index# -1)
      (while (< (setq Index# (1+ Index#)) (sslength SS&))
      (setq EntList@ (entget (ssname SS& Index#))
            DimLayer$ (cdr (assoc 8 EntList@))
            LayerInfo@ (tblsearch "LAYER" DimLayer$)
      );setq
      (if (and (= (cdr (assoc 70 LayerInfo@)) 0)(> (cdr (assoc 62 LayerInfo@)) 0))
          (if (assoc DimLayer$ LayerList@)
            (setq Num# (1+ (cdr (assoc DimLayer$ LayerList@)))
                  LayerList@ (subst (cons DimLayer$ Num#) (assoc DimLayer$ LayerList@) LayerList@)
            );setq
            (setq LayerList@ (append LayerList@ (list (cons DimLayer$ 1))))
          );if
      );if
      );while
      (if LayerList@
      (progn
          (setq Layer$ (car (car LayerList@))
                Num# (cdr (car LayerList@))
          );setq
          (foreach List@ (cdr LayerList@)
            (if (> (cdr List@) Num#)
            (setq Layer$ (car List@)
                  Num# (cdr List@)
            );setq
            );if
          );foreach
      );progn
      );if
    );progn
);if
Layer$
);defun GetDimLayer
;-------------------------------------------------------------------------------
(princ);End of DPL.lsp

hhaoma 发表于 2014-8-29 06:26:44

Atsai 发表于 2014-8-28 21:57 static/image/common/back.gif
我是利用下面的源码改的!
有点长,如果看得懂,应该就有办法改。

你可以把改好的 发上来吗?谢谢啊

hhaoma 发表于 2014-8-29 06:27:25

Atsai 发表于 2014-8-28 21:57 static/image/common/back.gif
我是利用下面的源码改的!
有点长,如果看得懂,应该就有办法改。

你可以把改好的 发上来吗?谢谢啊

hhaoma 发表于 2014-8-29 18:41:28

本帖最后由 hhaoma 于 2014-8-29 18:43 编辑

Atsai 发表于 2014-8-29 15:07 static/image/common/back.gif
指令:adbmz
我的是加号 你的是减号不符合要求。而且你标注的距离也不符合我的要求。
希望可以再改改
页: 1 [2]
查看完整版本: 帮忙解决下由两个方形组成的图形,点击内部列出计算公式