Aller au contenu

SVP Routine Lisp depuis OD pour changer la Rotation d un Bloc


Messages recommandés

Posté(e)

Hello

Je pensais avoir la routine sur les ODs en stock ... Mais NON !

Donc j ai des Blocs avec ODs dont l un des champs OD (Reel/Float) est la Rotation en Degres ou en Grades ...

Voila ma demande :

-- Selectionner le Bloc de reference - Clic a l ecran ...

-- Selectionner la bonne table OD

-- Selectionner le bon champ OD (numerique bien sur)

Pour les 2 questions ci-dessus, cela peut etre une simple question sur l ecran texte

( On suppose que l operateur va donner les 2 BONs Noms ... Ainsi pas besoin de DCL pour choisir )

-- Selectionner les Blocs sur lesquels on veut agir ...

-- Question: le champ OD "rotation" est en Grades ou en Degres (Defaut Degres) ?

... AGIR sur les Blocs selectionner en les "tournant"

ATTENTION : le DWG courant peut etre en Degres decimaux (Nord a l Est - Sens Trigo) OU en Grades (Zero au Nord - Sens horaire)

 

Merci d avance de votre aide !?

Bonne journee, La Sante, Bye, lecrabe

 

 

Autodesk Expert Elite Team

Posté(e)

Salut,

En partant du OD2DXF38 et en l'adaptant, cela ferait-il l'affaire?

(vl-load-com)
(defun str2lst (str sep / pos)
  (if (setq pos (vl-string-search sep str))
    (cons
      (substr str 1 pos)
      (str2lst (substr str (+ (strlen sep) pos 1)) sep)
    )
    (list str)
  )
)
(defun ListBox (title msg keylab flag / tmp file dcl_id choice)
  (setq
    tmp (vl-filename-mktemp "tmp.dcl")
    file (open tmp "w")
  )
  (write-line
    (strcat "ListBox:dialog{label=\"" title "\";")
    file
  )
  (if (and msg (/= msg ""))
    (write-line (strcat ":text{label=\"" msg "\";}") file)
  )
  (write-line
    (cond
      ((= 0 flag) "spacer;:popup_list{key=\"lst\";")
      ((= 1 flag) "spacer;:list_box{key=\"lst\";")
      (T "spacer;:list_box{key=\"lst\";multiple_select=true;")
    )
    file
  )
  (write-line "}spacer;ok_cancel;}" file)
  (close file)
  (setq dcl_id (load_dialog tmp))
  (if (not (new_dialog "ListBox" dcl_id))
    (exit)
  )
  (start_list "lst")
  (mapcar 'add_list (mapcar 'cdr keylab))
  (end_list)
  (action_tile
    "accept"
    "(or (= (get_tile \"lst\") \"\")
      (if (= 2 flag)
        (progn
          (foreach n (str2lst (get_tile \"lst\") \" \")
            (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice))
          )
          (setq choice (reverse choice))
        )
        (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab)))
      )
    )
    (done_dialog)"
  )
  (start_dialog)
  (unload_dialog dcl_id)
  (vl-file-delete tmp)
  choice
)
(defun c:OD2DXF50 ( / js obj dxf_ent ename lst_tabl_def inc_key lst_def desc_od desc_tbl str)
  (princ "\nSélectionnez les insertions de blocs.")
  (while
    (null
      (setq js
        (ssget
          (list
            '(0 . "INSERT")
            (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
            (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
          )
        )
      )
    )
    (princ "\nCe n'est pas un objet valable pour cette fonction!")
  )
  (repeat (setq n (sslength js))
    (setq
      obj (ssname js (setq n (1- n)))
      dxf_ent (entget obj)
      ename (vlax-ename->vla-object obj)
    )
    (cond
      ((ade_odgettables obj)
        (setq lst_tabl_def (mapcar 'ade_odtabledefn (ade_odgettables obj)) inc_key 0)
        (foreach n lst_tabl_def
          (foreach el n
            (if (listp (cdr el))
              (foreach sel (cdr el)
                (foreach msel sel
                  (if (eq (car msel) "ColName")
                    (setq lst_def (cons (cons (strcat "key" (itoa (setq inc_key (1+ inc_key)))) (cdr msel)) lst_def))
                  )
                )
              )
            )
          )
        )
        (if (not desc_od)
          (setq desc_od (cdr (assoc (listbox "Donnée d'objet" "Choisir une données d'objet" lst_def 1) lst_def)) desc_tbl nil)
        )
        (foreach n lst_tabl_def
          (if (assoc (cons "ColName" desc_od) (cdaddr n))
            (setq desc_tbl (cdar n))
          )
        )
        (cond
          (desc_tbl
            (setq str (ade_odgetfield obj desc_tbl desc_od 0))
            (cond
              ((eq (type str) 'STR) (setq str (atof str)))
              ((eq (type str) 'INT) (setq str (float str)))
            )
            (entmod (subst (cons 50 str) (assoc 50 dxf_ent) dxf_ent))
          )
        )
      )
      (T (princ "\nPas de données d'objet attachées"))
    )
  )
  (prin1)
)

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Hello @bonuscad

1) MERCI pour ta routine "OD2DXF50" !

2) En effet elle "tourne" les Blocs VANNE par rapport au champ OD "rotation" MAIS PAS DU TOUT comme je le desire !?

3) Voir le DWG joint ...

Les champs "rotation" sont a 90 , - 90 , 100 , -100 afin de tester soit en Mode Trigo (0-360 - Zero a l Est - Sens Trigo), soit en Mode Grade (0-400 - Zero au Nord - Sens "normal") !

J imagine qu il faut tester le "type" d angle !?

La Sante, Bye, lecrabe

 

 

MAP_BLOCK_OD_Rotation_1.rar

Autodesk Expert Elite Team

Posté(e)

Bonjour, sans passer par du LISP, on peut faire ca avec MAP 3D en effectuant une requête depuis un autre fichier.

Ca sous-entend de faire en suite un copier/coller des éléments traités.

Lispeur éternel débutant!
Autocad Map3D 2023
Covadis-Autopist 18.2

Posté(e)

@lecrabe

Si tu rajoutes entre la ligne 112-113 : avant (entmod ....), cette ligne:

(setq str (+ (angtof (rtos str 2 16) (getvar "AUNITS")) (cdr (assoc 50 dxf_ent))))

Cela semble faire l'affaire...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Hello @Vincent P.

OUI bien sur mais c tellement plus simple et rapide par une routine Lisp / VLisp !

Encore MERCI a Bruno / Bonuscad pour toutes SES Merveilleuses routines sur les ODs de AutoCAD MAP / AutoCAD CIVIL !

Voir ICI par exemple ou la plupart des routines sont de Bruno / Bonuscad :

https://georezo.net/forum/viewtopic.php?id=44248

La Sante, Bonne soiree, Bye, lecrabe

 

 

Autodesk Expert Elite Team

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité