What i Mistake Mark dimension insertion point ?

What i Mistake Mark dimension insertion point ?

jaimuthu
Advocate Advocate
621 Views
10 Replies
Message 1 of 11

What i Mistake Mark dimension insertion point ?

jaimuthu
Advocate
Advocate

 

 

 

 

(defun c:DimJaiBasePointToInsertion ( / basePt selSet blkName blkObj blkPt dimOffset dimSpacing currentPt i count)
  
  (setq dimSpacing 0.5) 
  
  (setq basePt (getpoint "\nSelect base point: "))
  
  (setq blkName "jai")
  
  (setq selSet (ssget '((0 . "INSERT") (2 . "jai"))))
  
  (if selSet
    (progn
     
      (setq dimOffset 0.0)
      (setq count (sslength selSet))      
      (setq i 0) 
      (while (< i count) 
        (setq blkObj (ssname selSet i)) 
        (setq blkPt (cdr (assoc 10 (entget blkObj))))
       
        (if blkPt
          (progn
           
            (setq currentPt (list (car basePt) (+ (cadr basePt) dimOffset) (caddr basePt)))
           
            (command "._dimlinear" currentPt blkPt)
	    
            (setq dimOffset (+ dimOffset dimSpacing))
          )
          (princ "\nInvalid block point encountered.")
        )

        (setq i (1+ i))
      )
    )
    (princ "\nNo blocks named 'jai' found.")
  )

  
  (princ)
)

 

 

i want mark dimension in block name having the name of "jai" but its mark only some blocks  here i attached dwg file is what i need 

0 Likes
Accepted solutions (4)
622 Views
10 Replies
Replies (10)
Message 2 of 11

ВeekeeCZ
Consultant
Consultant

You need to add another loop to gather all the x-coords and sort the blocks by them.

 

Here is example of sort func

https://help.autodesk.com/view/ACD/2025/ENU/?guid=GUID-F3B27BD2-27FA-4185-B22C-85509175C171

0 Likes
Message 3 of 11

-didier-
Advisor
Advisor
Accepted solution

Bonjour @jaimuthu 

 

here’s what I propose with a sorting of the increasing X as suggested @ВeekeeCZ 

 

Amicalement

 

 

;|
https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/what-i-mistake-mark-dimension-insertion-point/m-p/13085107#M473004
question sur les dim linéaires
je propose ça avec un tri des points de ss  avec les x croissants
|;
(defun c:dimjai ( / basept lst n offset ss)
    (setq offset 0.2)
    (setq basePt (getpoint "\nSelect base point: "))
    (setq ss (ssget '((0 . "INSERT") (2 . "jai"))))
    (repeat (setq n (sslength ss))
        (setq lst (cons (list
                        (car (cdr (assoc 10 (entget (ssname ss (setq n (1- n)))))))
                        (cadr basept))
                    lst)
              )
        )
    (setq n 0)
    (setq lst (vl-sort lst (function (lambda (e1 e2) (< (car e1) (car e2))))))
    (foreach item lst
        (command "._dimlinear" basept item (list (car basept) (+ (cadr basept) (* offset (setq n (1+ n))))))        
    )
    )

 

Éternel débutant.. my site for learning : Programmer dans AutoCAD

DA

EESignature

0 Likes
Message 4 of 11

Moshe-A
Mentor
Mentor
Accepted solution

@jaimuthu hi,

 

you need to sort blocks position before adding dimensions

call the following function with BasePt and the selection set of blocks and it will return you with this list sorted by the distance from BasePt

 

'(((dist1 '(x y z)) (dist2 '(x y z)) ...)

 

enjoy

Moshe

 

 

(defun dsort (base ss)
 (vl-sort		    
  (mapcar
   (function
     (lambda (elist / p0)
      (setq p0 (list (car (cdr (assoc '10 elist))) (cadr base))) 
      (cons (distance base p0) (list (list p0)))
     )
   )
   (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  )
  (function (lambda (e0 e1) (< (car e0) (car e1)))) 
 )
)

 

 

 

0 Likes
Message 5 of 11

jaimuthu
Advocate
Advocate

it is possible create Vertical Dimension in same way ?

0 Likes
Message 6 of 11

Moshe-A
Mentor
Mentor

@jaimuthu ,

 

here is a fix to (dsort) function

 

a 3th argument direction is added:  

if you pass 'HOR, you will get list for horizontal dimension

if you pass 'VER, you will get list for vertical dimension

 

enjoy

moshe

 

 

(defun dsort (base ss direction)
 (vl-sort		    
  (mapcar
   (function
     (lambda (elist / p0)
      (if (eq dir 'HOR)
       (setq p0 (list (car (cdr (assoc '10 elist))) (cadr base)))
       (setq p0 (list (car base) (cadr (cdr (assoc '10 elist)))))
      )
      (cons (distance base p0) (list (list p0)))
     )
   )
   (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  )
  (function (lambda (e0 e1) (< (car e0) (car e1)))) 
 )
)

 

 

 

0 Likes
Message 7 of 11

jaimuthu
Advocate
Advocate

its not work 

0 Likes
Message 8 of 11

Moshe-A
Mentor
Mentor

It is not working does not help me to understand.

 

Post the code you are running

0 Likes
Message 9 of 11

Moshe-A
Mentor
Mentor
Accepted solution

@jaimuthu ,

 

check this

works only at 0.0 or 90.0 angle

 

 

(defun c:DimJaiBasePointToInsertion ( / askOrient dsort ; local functions
				        dimSpacing basePt orient selSet points^ i pt0 pt1)
  
 (defun askOrient (def / ask)
  (initget "Horizontal Vertical")
  (setq ask (getkword (strcat "\nDimension orientation [Horizontal/Vertical] <" def ">: ")))

  (cond
   ((not ask)
    (if (eq def "Horizontal") 0.0 (/ pi 2))
   )
   ((eq ask "Horizontal")
    0.0
   )
   ( t (/ pi 2))
  )
 ); askOrient
  
  
 ; return list of dimension points
 (defun dsort (base ss ang)
  (mapcar
   (function
    (lambda (item)
     (caadr item)
    ); lambda
   ); function
   (vl-sort		    
    (mapcar
     (function
      (lambda (elist / p0)
       (if (eq ang 0.0)
        (setq p0 (list (car (cdr (assoc '10 elist))) (cadr base)))
        (setq p0 (list (car base) (cadr (cdr (assoc '10 elist)))))
       ); if
       (cons (distance base p0) (list (list p0)))
      ); lambda
     ); function
     (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
    ); mapcar
    (function (lambda (e0 e1) (< (car e0) (car e1)))) 
   ); vl-sort
  ); mapcar
 ); dsort

  
 ; here start c:DimJaiBasePointToInsertion
 (setvar "cmdecho" 0)
 (command "._undo" "_begin")
 
 (setq dimSpacing 0.25) ; const
  
 (if (and
       (setq basePt (getpoint "\nSpecify base point: "))
       (setq orient (askOrient "Horizontal"))
       (setq selSet (ssget '((0 . "insert") (2 . "jai"))))
     )
  (progn
   (setq points^ (dsort basePt selSet orient))

   (setq i 0)
   (setq pt0 (car points^))
   (foreach pt1 (cdr points^)
    (if (= orient 0.0)
     (command "._dimlinear" pt0 pt1 (list (car pt1) (+ (cadr basePt) (* dimSpacing (setq i (1+ i))))))
     (command "._dimlinear" pt0 pt1 (list (- (car pt1) (* dimSpacing (setq i (1+ i)))) (cadr pt1)))
    ); if
    (setq item0 item1)
   ); foreach
  ); progn
 ); if

 (command "._undo" "_end")
 (setvar "cmdecho" 1)
  
 (princ)
)

 

 

 

0 Likes
Message 10 of 11

jaimuthu
Advocate
Advocate

Its work good Thanks for Your Response

0 Likes
Message 11 of 11

Moshe-A
Mentor
Mentor
Accepted solution

fixed a bug 🤣

0 Likes