;Make Dimensions negative (and set them back)
;by ARKANCE - www.arkance.world  -  www.cadforum.cz

(defun C:DimNeg ( / ent ss minv maxv i edata aux dimst overt)
 (princ "\nSelect dimensions or <sel by value>: ")
 (setq ss (ssget (list '(0 . "DIMENSION") '(-4 . "<NOT") '(1 . "*-<>*") '(-4 . "NOT>"))))
 (if (not ss)(progn
  (setq aux (getstring T "\nAll using DimStyle(s) <\"*\">: "))
  (setq dimst (if (> aux "") aux "*"))
  (setq aux (getdist "\nAll with min.value <0>: "))
  (setq minv (if aux aux 0.0))
  (setq aux (getdist "\nAll with max.value <1e99>: "))
  (setq maxv (if aux aux 1e99))
  (setq ss (ssget "_X" (list '(0 . "DIMENSION") '(-4 . "<NOT") '(1 . "*-<>*") '(-4 . "NOT>") ; no dups
                             (cons 3 dimst) '(-4 . ">=")(cons 42 minv) '(-4 . "<=")(cons 42 maxv))))
 ))
 (if ss (progn
  (setq i -1)
  (while (< (setq i (1+ i)) (sslength ss))
   (setq ent (ssname ss i)  edata (entget ent))
   (setq overt (cdr (assoc 1 edata)))
   (if (> overt "") ; old override?
    (setq overt (vl-string-subst "-<>" "<>" overt)) ; "<> mm" -> "-<> mm"
    (setq overt "-<>")
   )
   (entmod (subst (cons 1 overt) (assoc 1 edata) edata))
   (entupd ent)
  )
  (princ (strcat "\n" (itoa (sslength ss)) " dimensions set to negative (use DimDef to revert)"))
 )
  (princ "no dimensions")
 )
 (princ)
)

;back to default
(defun C:DimDef ( / ent ss i edata overt)
 (setq ss (ssget "_X" (list '(0 . "DIMENSION")'(1 . "*-<>*"))))
 (if ss (progn
  (setq i -1)
  (while (< (setq i (1+ i)) (sslength ss))
   (setq ent (ssname ss i)  edata (entget ent))
   (setq overt (cdr (assoc 1 edata)))
   (setq overt (vl-string-subst "<>" "-<>" overt))
   (if (= overt "<>")(setq overt "")) ; pure?
   (entmod (subst (cons 1 overt) (assoc 1 edata) edata))
   (entupd ent)
  )
  (princ (strcat "\n" (itoa (sslength ss)) " dimensions set do default"))
 )
  (princ "no negative dimensions")
 )
 (princ)
)

(princ "\nDimNeg and DimDef commands loaded (negative dimensions, by ARKANCE)")
(princ)
