Jump to content
Ajmal

UCS setting

Recommended Posts

Ajmal

In UCS “w” it's working perfectly. But if I will put any UCS I can't work properly. Not coming properly

How to solve this issue

(defun c:DRL (/ decs ;|diff|; elist level osm p1 p2 slope strlevel txtelev txthgt txtpt)
 (setq osm (getvar 'osmode))
 (while (and
   (or (not
  (setq txtelev (entsel "\nSelect starting level text : ")))
       (not
  (eq "TEXT"
      (cdr (assoc 0 (setq elist (entget (car txtelev)))))))))
   (princ
     "\n Nothing selected or wrong object type selected, try again")
   )
 (setq strlevel (cdr (assoc 1 elist))
 
level1  (atof strlevel)
txthgt  (cdr (assoc 40 elist))
)
  (setq level (* level1 1000))

 (initget 6)
 (setq slope (getreal "\n Enter slope in decimals <0.01> : "))
 (if (not slope)
   (setq slope 0.01))
 (setvar 'osmode 695)
 (setq p1 (getpoint "\nPick first point:"))
    (setq p1 (list (car p1)(cadr p1)))
;;;  (setq diff (mapcar '- (cdr (assoc 10 elist)) p1))

 (while (setq p2 (getpoint "\nPick next point (or press Enter to Exit): "))
   (setq p2 (list (car p2)(cadr p2)))
   (setq level    (- level (* (distance p1 p2) slope))
	 strlevel (rtos level 2 0)
	 txtpt   (getpoint "\nPick a text point: "); (mapcar '+ p2 diff)
	 )
   (setq strlevelwp(strcat "IL " (rtos (/ level 1000) 2 3)"M"))
   (entmake
     (list
'(0 . "TEXT")
'(100 . "AcDbEntity")
'(100 . "AcDbText")
(cons 10 txtpt)
(cons 11 (list 0.0 0.0 0.0))
(cons 40 txthgt)
(cons 1 strlevelwp)
'(50 . 0.0)
'(41 . 1.0)
'(51 . 0.0)
'(7 . "Standard")
'(71 . 0)
'(72 . 0)
(cons 210 (list 0.0 0.0 1.0))
'(73 . 0))
     )
   (setq p1 p2)
   )

 (setvar 'osmode osm)
 (princ)
 )

 

Share this post


Link to post
Share on other sites
devitg

@Ajmal please upload your sample.dwg where yo apply such lisp 

 

Regards

 

Share this post


Link to post
Share on other sites
dlanorh

Read about the (trans) function. You are also including lots of items with their default value (codes 41 50 51 71 72 210 & 73) so you don't need to include them unless they won't be the default value.

Share this post


Link to post
Share on other sites
Lee Mac
Posted (edited)

As dlanorh correctly suggests, trans is the key function here - perhaps consider something along the lines of the following:

(defun c:drl ( / *error* ang dis ent enx ins lvl ocs osm pt1 pt2 slp )

    (defun *error* ( msg )
        (if (= 'int (type osm)) (setvar 'osmode osm))
        (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
            (princ (strcat "\nError: " msg))
        )
        (princ)
    )
   
    (setq osm (getvar 'osmode)
          ocs (trans '(0.0 0.0 1.0) 1 0 t)
          ang (angle '(0.0 0.0) (trans (getvar 'ucsxdir) 0 ocs t))
          dis (lambda ( a b ) (distance (list (car a) (cadr a)) (list (car b) (cadr b))))
    )
    
    (while
        (progn
            (setvar 'errno 0)
            (setq ent (car (entsel "\nSelect starting level text: ")))
            (cond
                (   (= 7 (getvar 'errno))
                    (princ "\nMissed, try again.")
                )
                (   (null ent)
                    nil
                )
                (   (/= "TEXT" (cdr (assoc 0 (setq enx (entget ent)))))
                    (princ "\nThe selected object is not text.")
                )
                (   (not (setq lvl (distof (cdr (assoc 1 enx)) 2)))
                    (princ "\nThe selected text does not have numerical content.")
                )
                (   (progn
                        (initget 6)
                        (setq slp (cond ((getreal "\nSpecify slope in decimal <0.01>: ")) (0.01))
                              lvl (* 1000.0 lvl)
                        )
                        (setvar 'osmode 695)
                        (setq pt1 (getpoint "\nSpecify first point: "))
                    )
                    (while
                        (and
                            (setq pt2 (getpoint "\nSpecify next point <exit>: " pt1))
                            (setq ins (getpoint "\nSpecify text insertion <exit>: "))
                        )
                        (setq lvl (- lvl (* (dis pt1 pt2) slp)))
                        (entmake
                            (list
                               '(000 . "TEXT")
                                (cons 010 (trans ins 1 ocs))
                                (cons 001 (strcat "IL " (rtos (/ lvl 1000.0) 2 3) "M"))
                                (assoc 40 enx)
                                (cons 050 ang)
                                (cons 210 ocs)
                            )
                        )
                        (setq pt1 pt2)
                    )
                    nil
                )
            )
        )
    )
    (setvar 'osmode osm)
    (princ)
)

 

Edited by Lee Mac
  • Thanks 1

Share this post


Link to post
Share on other sites
Ajmal
12 hours ago, Lee Mac said:

As dlanorh correctly suggests, trans is the key function here - perhaps consider something along the lines of the following:


(defun c:drl ( / *error* ang dis ent enx ins lvl ocs osm pt1 pt2 slp )

    (defun *error* ( msg )
        (if (= 'int (type osm)) (setvar 'osmode osm))
        (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
            (princ (strcat "\nError: " msg))
        )
        (princ)
    )
   
    (setq osm (getvar 'osmode)
          ocs (trans '(0.0 0.0 1.0) 1 0 t)
          ang (angle '(0.0 0.0) (trans (getvar 'ucsxdir) 0 ocs t))
          dis (lambda ( a b ) (distance (list (car a) (cadr a)) (list (car b) (cadr b))))
    )
    
    (while
        (progn
            (setvar 'errno 0)
            (setq ent (car (entsel "\nSelect starting level text: ")))
            (cond
                (   (= 7 (getvar 'errno))
                    (princ "\nMissed, try again.")
                )
                (   (null ent)
                    nil
                )
                (   (/= "TEXT" (cdr (assoc 0 (setq enx (entget ent)))))
                    (princ "\nThe selected object is not text.")
                )
                (   (not (setq lvl (distof (cdr (assoc 1 enx)) 2)))
                    (princ "\nThe selected text does not have numerical content.")
                )
                (   (progn
                        (initget 6)
                        (setq slp (cond ((getreal "\nSpecify slope in decimal <0.01>: ")) (0.01))
                              lvl (* 1000.0 lvl)
                        )
                        (setvar 'osmode 695)
                        (setq pt1 (getpoint "\nSpecify first point: "))
                    )
                    (while
                        (and
                            (setq pt2 (getpoint "\nSpecify next point <exit>: " pt1))
                            (setq ins (getpoint "\nSpecify text insertion <exit>: "))
                        )
                        (setq lvl (- lvl (* (dis pt1 pt2) slp)))
                        (entmake
                            (list
                               '(000 . "TEXT")
                                (cons 010 (trans ins 1 ocs))
                                (cons 001 (strcat "IL " (rtos (/ lvl 1000.0) 2 3) "M"))
                                (assoc 40 enx)
                                (cons 050 ang)
                                (cons 210 ocs)
                            )
                        )
                        (setq pt1 pt2)
                    )
                    nil
                )
            )
        )
    )
    (setvar 'osmode osm)
    (princ)
)

 

Lee mac, Thank you for such a wonderful help. Its working good.

 

 

(setq p1 (getpoint "\nPick first point:"))
    (setq p1 (list (car p1)(cadr p1)))

This one I add for taking z axis only.  That (xxx.xx,xxx.xxx,000.00)

I always need Z axis “00.00” because am drafting 2d some time the line has z axis, then if I will take quantity that time coming wrong.

Can you explain this this a easy way, if you don’t mind?

Share this post


Link to post
Share on other sites
Lee Mac
6 hours ago, Ajmal said:

Lee mac, Thank you for such a wonderful help. Its working good.

 

You're welcome.

 

6 hours ago, Ajmal said:

(setq p1 (getpoint "\nPick first point:"))
    (setq p1 (list (car p1)(cadr p1)))

This one I add for taking z axis only.  That (xxx.xx,xxx.xxx,000.00)

I always need Z axis “00.00” because am drafting 2d some time the line has z axis, then if I will take quantity that time coming wrong.

Can you explain this this a easy way, if you don’t mind?

 

That addition is not necessary, as the distance calculation in my code is performed by the locally defined 'dis' function, which calculates the 2D distance.

Share this post


Link to post
Share on other sites
myloveflyer
(entmake (list '(0 . "TEXT") (cons 1 str) (cons 10 pt) (cons 40 5)))
(entmake (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") '(7 . "Standard") (cons 1 str) (cons 10 pt)))

Included items necessary for writing

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...