ziele_o2k 发表于 2022-7-5 15:40:02

[Lisp]细节长度计数器

也许有人会认为这是一个有用的工具-只需检查gif即可。
 
https://media.giphy.com/media/l0HU8OGO0xSIui0lq/giphy.gif
 
;; ============================================== ;;
;;                                                ;;
;;   @@@@@ @ @@@@ @    @@@@      @@@   @@@@   ;;
;;      @@ @    @    @      @   @ @@ @ @    ;;
;;   @   @ @@@@ @    @@@@   @   @   @@@   ;;
;;    @    @ @    @    @      @   @@   @ @    ;;
;;   @@@@@ @ @@@@ @@@@ @@@@ @@@@@@@@@@ @@   ;;
;;                                                ;;
;; ============================================== ;;
;; 22:50 2018-01-11 © ziele_o2k                   ;;
;; ============================================== ;;
;; some code copied from Lee Mac's Block Counter;;
;; http://www.lee-mac.com/blockcounter.html       ;;
;; ============================================== ;;
(defun c:detsum ( /pz:sub _pt _ss _enx _k _v _res _tab _row _hgt _wth _tg1 _tg2 _tg3)
(defun pz:sub ( @key @val @lst / _itm )
   (if (setq _itm (assoc @key @lst))
   (subst (cons @key (+ @val (cdr _itm))) _itm @lst)
   (cons(cons @key @val) @lst)
   )
)
(if
   (and
   (setq _ss (ssget '((0 . "DIM*"))))
   (setq _pt (cd:USR_GetPoint "\nTable insertion point: " 1 nil))
   )
   (progn
   (foreach %1 (cd:SSX_Convert _ss 0)
       (setq
         _enx(entget %1)
         _k    (cdr(assoc1 _enx))
         _v    (cdr(assoc 42 _enx))
         _res(pz:sub _k _v _res)
       )
   )
   (setq _res
       (vl-sort
         (mapcar
          '(lambda (%)
             (list (car %) (cd:CON_Real2Str (cdr %) 2 1))
         )
         _res
         )
         '(eval (list 'lambda '( a b ) (list '< '(strcase (car a)) '(strcase (car b)))))
       )
   )
   (setq _hgt
       (vla-gettextheight
         (vla-item
         (vla-item (vla-get-dictionaries (cd:ACX_ADoc)) "acad_tablestyle")
         (getvar 'ctablestyle)
         )
         acdatarow
       )
       _tg1 "Detail sum"
       _tg2 "Detail name"
       _tg3 "Sum"
   )
   (setq _tab
       (cd:ACX_AddTable
         (cd:ACX_ASpace) _pt
         (+ (length _res) 2)
         2
         (* 2 _hgt)
         (* _hgt
         (max
             (apply 'max
               (mapcar 'strlen
               (append
                   (list _tg2)
                   (list _tg3)
                   (apply 'append _res)
               )
               )
             )
             (/ (strlen _tg1) 2)
         )
         )
       )
   )
   (vla-setText _tab 0 0 _tg1)
   (vla-setText _tab 1 0 _tg2)
   (vla-setText _tab 1 1 _tg3)
   (setq _row 2)
   (foreach %1 _res
       (vla-setText _tab _row 0 (car %1))
       (vla-setText _tab _row 1 (cadr %1))
       (setq _row (1+ _row))
   )
   )
)
(princ)
)


;; ================================================================== ;;
;; ================================================================== ;;
;; ================================================================== ;;
;; ================================================================== ;;
;; Subfunctions form CADPL-Pack-v1.lsphttp://forum.cad.pl         ;;
;; ================================================================== ;;
;; ================================================================== ;;
;; ================================================================== ;;
;; ================================================================== ;;


; =========================================================================================== ;
; Pobiera punkt od uzytkownika / Gets point from user                                       ;
;Msg       - komunikat do wyswietlenia / message to display                            ;
;Bit - bit sterujacy (patrz initget) / control bit (see initget)               ;
;Pt - punkt bazowy / base point                                                 ;
; ------------------------------------------------------------------------------------------- ;
; (cd:USR_GetPoint "\nWskaz punkt: " 1 nil)                                                   ;
; (cd:USR_GetPoint "\nWskaz drugi punkt: " 32 '(5 10 0))                                    ;
; =========================================================================================== ;
(defun cd:USR_GetPoint (Msg Bit Pt / res)
(if Bit (initget Bit))
(if
   (listp
   (setq res
       (vl-catch-all-apply
         (quote getpoint)
         (if Pt
         (list Pt Msg)
         (list Msg)
         )
       )
   )
   )
   res
)
)
; =========================================================================================== ;
; Zmienia PICKSET na liste obiektow / Convert PICKSET to list of objects                      ;
;Ss    - zbior wskazan / selection sets                                          ;
;Mode    - typ zwracanych obiektow / type of returned objects                        ;
;                   0 = ENAME, 1 = VLA-OBJECT, 2 = SAFEARRAY                                  ;
; ------------------------------------------------------------------------------------------- ;
; (cd:SSX_Convert (ssget) 1)                                                                  ;
; =========================================================================================== ;
(defun cd:SSX_Convert (Ss Mode / n res)
(if
   (and
   (member Mode (list 0 1 2))
   (not
       (minusp
         (setq n
         (if Ss (1- (sslength Ss)) -1)
         )
       )
   )
   )
   (progn
   (while (>= n 0)
       (setq res
         (cons
         (if (zerop Mode)
             (ssname Ss n)
             (vlax-ename->vla-object (ssname Ss n))
         )
         res
         )
             n (1- n)
       )
   )
   (if (= Mode 2)
       (vlax-safearray-fill
         (vlax-make-safearray 9
         (cons 0 (1- (length res)))
         ) res
       )
       res
   )
   )
)
)
; =========================================================================================== ;
; Konwertuje liczbe na lancuch tekstowy / Converts number to a string                         ;
;Val - liczba do konwersji / conversion number                                  ;
;Unit - jednostki wyjsciowe / output unit                                        ;
;                  nil = domyslne / default | (getvar "LUNITS")                           ;
;                  1   = naukowe / scientific                                             ;
;                  2   = dziesietne / decimal                                             ;
;                  3   = inzynierskie / engineering                                       ;
;                  4   = architektoniczne / architectural                                 ;
;                  5   = ulamkowe / fractional                                              ;
;Prec - INT = liczba miejsc po przecinku / number of decimal places            ;
;                  nil = domyslna / default | (getvar "LUPREC")                           ;
; ------------------------------------------------------------------------------------------- ;
; (cd:CON_Real2Str 12 2 4)                                                                  ;
; =========================================================================================== ;
(defun cd:CON_Real2Str (Val Unit Prec / DMZ res)
(setq DMZ (getvar "DIMZIN"))
(setvar "DIMZIN"
   (if (not (member (getvar "LUNITS") (list 4 5)))
   (logand DMZ (~ ) 0
   )
)
(setq res
   (rtos
   Val
   (if (and Unit (member Unit (list 1 2 3 4 5)))
       Unit
       (getvar "LUNITS")
   )
   (if Prec Prec (getvar "LUPREC"))
   )
)
(setvar "DIMZIN" DMZ)
res
)
; =========================================================================================== ;
; Aktywny dokument / Active document                                                          ;
; =========================================================================================== ;
(defun cd:ACX_ADoc ()
(or
   *cd-ActiveDocument*
   (setq *cd-ActiveDocument*
   (vla-get-ActiveDocument (vlax-get-acad-object))
   )
)
*cd-ActiveDocument*
)
; =========================================================================================== ;
; Aktywny obszar / Active space                                                               ;
; =========================================================================================== ;
(defun cd:ACX_ASpace ()
(if (= (getvar "CVPORT") 1)
   (vla-item (cd:ACX_Blocks) "*Paper_Space")
   (cd:ACX_Model)
)
)
; =========================================================================================== ;
; Kolekcja Blocks / Blocks collection                                                         ;
; =========================================================================================== ;
(defun cd:ACX_Blocks ()
(or
   *cd-Blocks*
   (setq *cd-Blocks* (vla-get-blocks (cd:ACX_ADoc)))
)
*cd-Blocks*
)
; =========================================================================================== ;
; Tworzy obiekt typu ACAD_TABLE / Creates a ACAD_TABLE object                                 ;
;Space - kolekcja / collection | Model/Paper + Block Object                   ;
;Pb    - punkt bazowy tabeli / table base point                                    ;
;Rows- liczba wierszy / number of rows                                             ;
;Cols- liczba kolumn / number of columns                                           ;
;RowH- wysokosc wierszy / rows height                                              ;
;ColH- szerokosc kolumn / columns height                                           ;
; ------------------------------------------------------------------------------------------- ;
; (cd:ACX_AddTable (cd:ACX_ASpace) (getpoint) 5 5 10 30)                                    ;
; =========================================================================================== ;
(defun cd:ACX_AddTable (Space Pb Rows Cols RowH ColH)
(vla-AddTable
    Space
    (vlax-3d-point (trans Pb 1 0))
    Rows
    Cols
    RowH
    ColH
)
)

Grrr 发表于 2022-7-5 17:23:25

这很有趣,但是你在哪里使用这种尺寸标注?
这种类型会更清楚吗
https://image.ibb.co/cLJdK6/dim_note_sample.jpg
页: [1]
查看完整版本: [Lisp]细节长度计数器