Author Topic: ObjectScaleCurOnly does not works inside of blocks  (Read 1148 times)

0 Members and 1 Guest are viewing this topic.

jtm2020hyo

  • Newt
  • Posts: 198
ObjectScaleCurOnly does not works inside of blocks
« on: March 18, 2020, 07:51:58 PM »



I found a beautiful lisp called "ObjectScaleCurOnly" works great. but does not works inside any blocks (nested, dynamic and regular) and just drop this message:


Code: [Select]
0 objects scale removed.
4 objects don't support annotation scale <1:50>.
4 objects cannot remove scale.


https://autocadtips1.com/2016/07/09/lisp-delete-extra-annotative-scales-from-objects/

so my request is that any hero can modify create this lisp works inside the blocks?

Code: [Select]
::: Delete Annotative Scale Execpt Current
;;; By Irneb
;;; http://www.cadtutor.net/forum/showthread.php?53069-Annotative-troubles&p=359702&viewfull=1#post359702

(defun c:ObjectScaleCurOnly (/ ss n scLst OSC:GetScales)
  (print "Select the objects you wish to modify: ")
  (if (or (setq ss (ssget "I")) (setq ss (ssget)))
    (progn
      ;; Define helper function to get scales attached to an entity
      (defun OSC:GetScales (en / ed xn xd cdn cdd asn asd cn cd sn sd cannoscale)
        (setq ed (entget en))
        (if (and
              ;; Get the XDictionary attached to the object
              (setq xn (vl-position '(102 . "{ACAD_XDICTIONARY") ed))
              (setq xn (cdr (nth (1+ xn) ed)))
              (setq xd (entget xn))
              ;; Get the Context Data Management dictionary attached to the XDictionary
              (setq cdn (vl-position '(3 . "AcDbContextDataManager") xd))
              (setq cdn (cdr (nth (1+ cdn) xd)))
              (setq cdd (entget cdn))
              ;; Get the Annotation Scales dictionary attached to the CD
              (setq asn (vl-position '(3 . "ACDB_ANNOTATIONSCALES") cdd))
              (setq asn (cdr (nth (1+ asn) cdd)))
              (setq asd (entget asn))
              ;; Get the 1st scale attached
              (setq cn (assoc 3 asd))
              (setq cn (member cn asd))
            )
          ;; Step through all scales attached
          (while cn
            (if (and (= (caar cn) 350) ;It it's pointing to a scale record
                     ;; Get the record's data
                     (setq cd (entget (cdar cn)))
                     ;; Get the Context data class
                     (setq sn (assoc 340 cd))
                     (setq sd (entget (cdr sn)))
                     (setq sn (assoc 300 sd))
                     ;; Check if the scale is already in the list
                     (not (vl-position (cdr sn) scLst))
                )
              ;; Add it to the list
              (setq scLst (cons (cdr sn) scLst))
            )
            (setq cn (cdr cn))
          )
        )
      )

      ;; Find a list of scales used in selection
      (setq n (sslength ss))
      (while (>= (setq n (1- n)) 0)
        (OSC:GetScales (ssname ss n))
      )

      ;; Add the current scale to the selection
      (setq cannoscale (getvar "CANNOSCALE"))
      (command "._ObjectScale" ss "" "_Add" cannoscale "")

      ;; Remove all other scales attached
      (command "._ObjectScale" ss "" "_Delete")
      (foreach n scLst
        (if (wcmatch (strcase n) (strcat "~" (strcase cannoscale)))
          (command n)
        )
      )
      (command "")
    )
  )

  (princ)
)

PD: ObjectScaleCurOnly works like ObjectScale.

jtm2020hyo

  • Newt
  • Posts: 198
Re: ObjectScaleCurOnly does not works inside of blocks
« Reply #1 on: March 18, 2020, 08:00:42 PM »
sorry for the reply, I forget to add something:



in the image you can check "some scale", the request lisp too should change "that scales" to the current inside all blocks or selected blocks.