Gérer les images dans la palette de substitution des symboles P&iD

Lire la note technique TUYAU 39
[Téléchargement introuvable]

(télécharger l’application AP3D_CodeImagePngEnXML pour coder l’image )

Vérifier la pente d’une tuyauterie

Il existe bien la commande PLANTPIPESLOPE qui permet de vérifier la pente d’une tuyauterie mais celle-ci n’est pas très conviviale si l’on n’a pas à modifier la pente.

Voici donc un petit programme écrit en AutoLISP permettant de vérifier rapidement la pente et l’angle d’une tuyauterie.

Ce programme est mémorisé dans le fichier « AP3D_VerifPenteTuyau.lsp ». La commande à lancer se nomme « AP3D_VerifPenteTuyau ».

Verification pente tuyauterie

Voici le code du programe

;|
Dominique VAQUAND
25.02.2022
www.dovaq.fr
=================================================
Vérification pente et angle d'un tuyau Plant 3D
=================================================
|;

(defun c:AP3D_VerifPenteTuyau ( / ObjSelection pt1 pt2 Pt1_XY pt2_XY Long_Tuyau Long_Tuyau_XY Delta_Z Pente_Tuyau Angle_Tuyau)

(setvar "cmdecho" 0)

(defun *error* (s)
(command-s "_ucs" "_p")
(setq *error* nil)
)

(setq ObjSelection T)

(while ObjSelection

(princ "\nSélectionnez un tuyau: ")
(setq ObjSelection (entget (car (entsel))))

;; Vérification que l'objet sélectionné est bien un tuyau
(if (= (cdr (assoc 0 ObjSelection)) "ACPPPIPE")
(progn

(command "_ucs" "")

;; Récupère les coordonnées du point début et fin du tuyau
(setq Pt1 (cdr (assoc 10 (reverse ObjSelection))))
(setq Pt2 (cdr (assoc 11 (reverse ObjSelection))))

;; Calcul longueur du tuyau
(setq Long_Tuyau (distance Pt1 Pt2))

;;; (setq distance_X (abs (- (car pt1) (car pt2)))
;;; distance_Y (abs (- (cadr pt1) (cadr pt2)))
;;; )
;;; (setq Distance_XY (sqrt (+ (expt distance_x 2) (expt distance_y 2))))

;; Projection en XY des points PT1 et PT2
(setq Pt1_XY (list (car pt1) (cadr pt1) 0))
(setq pt2_XY (list (car pt2) (cadr pt2) 0))
(setq Long_Tuyau_XY (distance Pt1_xy Pt2_xy))

;; Calcul distance en Z
(setq Delta_Z (abs (float (- (caddr pt1) (caddr pt2)))))

(if (equal Pt1_XY pt2_XY)
(alert "Tuyau vertical")
(progn

;; Calcul pente du tuyau
(setq Pente_Tuyau

(strcat "Pente = " (rtos (abs (* 100.0 (/ Delta_Z Long_Tuyau_xy))) 2 1) "%")
)

;; Calcul angle du tuyau
(setq Angle_Tuyau (strcat "Angle = " (rtos (abs (* (atan (/ Delta_Z Long_Tuyau_xy)) (/ 180 pi))) 2 1) "°"))

;; Affichage sur ligne de commande
(princ (strcat "Vérification Pente : " Pente_Tuyau " " Angle_tuyau))

;; Affichage des informations Pente et Angle
(alert (strcat "Vérification Pente\n\n" Pente_Tuyau "\n" Angle_tuyau))

)
)

(command-s "_ucs" "_p")

); fin condition vrai

(alert "Cet objet n'est pas un tuyau")
); Fin de la condition

); fin du while

(princ)

); fin du programme

 

Créer des axes sur des conduites de tuyauteries

AutoCAD Plant 3D ne matérialise pas les traits d’axe des conduites de tuyauterie. Ce n’est qu’en sélectionnant un tuyau, une ligne que les traits d’axe apparaîssent furtivement.

Voici une étude d’un programme AutoLISP qui construit les traits d’axe sur tous les objets Plant 3D sélectionnés. Cette étude vous montre comment, avec ce langage AutoLISP, traiter des objets Plant 3D.

Ce programme est mémorisé dans le fichier « Ap3D_AxesT.lsp » et contient deux commandes :

  • La commande « Ap3D_AxesT » qui permet de créer les traits d’axe et les place sur le calque « AP3D_Axes_Tuyauterie »
  • La commande « AP3D_EffacerAxesT » qui permet d’effecer tous les objets sur le calque « AP3D_Axes_Tuyauterie »

Ap3D_AxesT

Je vous invite également à lire la note technique N° 34 de TUYAU

;|
Dominique VAQUAND
20.02.2020
=====================================================
Trace un trait d'axe sur des conduites de tuyauteries
=====================================================
|;

(defun c:AP3D_AxesT (/ Selection CalqueCourant
Osmode OBJ OBJ_1 OBJ_2
X_LignesAxes PT_10 Index_S
Index PT_S1 PT_S2 PT_S3
)

(setvar "cmdecho" 0)

; Sélection des objets PLANT 3D
(setq Selection (ssget (list (cons 0 "ACPPP*,ACPPC*"))))

(setq Index_S 0)

; Si des objets sont sélectionnés

(if Selection

(progn

; Mémorisation des paramètres de départ

(setq CalqueCourant (getvar "clayer"))
(setq Osmode (getvar "osmode"))
(setvar "osmode" 0)
(command "_ucs" "")

; Gestiion Erreur

(defun *error* (s)
(setvar "osmode" osmode)
(setvar "clayer" CalqueCourant)
(command "_UCS" "_p")
(setq *error* nil)
)

; Création du calque AP3D_Axes_Tuyauterie s'il n'existe pas ou met courant ce calque
(if (= (tblsearch "layer" "AP3D_Axes_Tuyauterie"))
(command "_layer" "_T" "AP3D_Axes_Tuyauterie" "_UN" "AP3D_Axes_Tuyauterie" "")
)

(command "_layer" "_m" "AP3D_Axes_Tuyauterie" "_co" "1" "" "" )

; Boucle sur le nombre d'objet PLANT 3D sélectionnés

(repeat (sslength Selection)

; récupération des codes DXF primaires

(setq OBJ (entget (ssname Selection Index_S)))

; Mémorisation de la coordonnée départ ou point d'insertion
(setq PT_10 (cdr (assoc 10 (reverse OBJ))))

; Mémorisatiobn des pointeurs
(setq OBJ_1 (entget (cdr (assoc 330 OBJ))))

; traitement pour tracer la ligne d'axe

(TraiteObj obj_1 360 obj PT_10)

(setq index_S (1+ index_S))

) ;repeat
)
) ;if

; Les lignes d'axes ont été créées, on les joint ensemble pour créer des polylignes 2D ou 3D

(setq X_LignesAxes
(ssget "x"
(list (cons 0 "LINE")
(cons 8 "AP3D_Axes_Tuyauterie")
)
)
)
(initcommandversion)
(command "_join" X_LignesAxes "")

; Remise des paramètres de départ

(setvar "osmode" osmode)
(setvar "clayer" CalqueCourant)
(command "_UCS" "_p")

(princ)
)

;|
==========================
Création des lignes d'axe
==========================
|;

(defun TraiteObj (Obj1x Codedxf objx PT_10x / PT_S1
PT_S2 PT_S3 PT_S4 PT_S5 PT_S6 index
OBJ_2
)

;; Tyuyau = (0 . "ACPPPIPE")
;; PT_10 et PT_11 existe

;; Composants = (0 . "ACPPPIPEINLINEASSET") ou (0 . "ACPPCONNECTOR")

(setq index 0)
(setq PT_S1 nil
PT_S2 nil
PT_S3 nil
PT_S4 nil
PT_S5 nil
PT_S6 nil
)

; si l'objet PLANT 3D est un tuyau on récupére les coordonnées des ports S1 et S2
; directement dals la liste des clés primaires

(if (= (cdr (assoc 0 objx)) "ACPPPIPE")
(progn
(setq pt_s1 (cdr (assoc 10 (reverse objx)))
pt_s2 (cdr (assoc 11 (reverse objx)))
)
(if (> (distance pt_s1 pt_s2) 0)
(command "_line" pt_s1 pt_s2 "")
)
)

; Sinon on recherche les ports S1, S2, ... depuis un nouveau pointeur
; une fois les ports S1, S2, ... trouvés on récupère la coordonnées du port
(progn

(setq OBJ_2 (entget (cdr (assoc Codedxf OBJ1x))))

; on boucle sur la liste pour récupérer la coordonnées du port

(repeat (length OBJ_2)

(if (= (cdr (nth index OBJ_2)) "S1")
(if (= PT_S1 nil)
(setq PT_S1 (cdr (nth (1+ index) OBJ_2)))
)
)

(if (= (cdr (nth index OBJ_2)) "S2")
(if (= PT_S2 nil)
(setq PT_S2 (cdr (nth (1+ index) OBJ_2)))
)
)

(if (= (cdr (nth index OBJ_2)) "S3")
(if (= PT_S3 nil)
(setq PT_S3 (cdr (nth (1+ index) OBJ_2)))
)
)

(if (= (cdr (nth index OBJ_2)) "S4")
(if (= PT_S4 nil)
(setq PT_S4 (cdr (nth (1+ index) OBJ_2)))
)
)

(if (= (cdr (nth index OBJ_2)) "S5")
(if (= PT_S5 nil)
(setq PT_S5 (cdr (nth (1+ index) OBJ_2)))
)
)

(if (= (cdr (nth index OBJ_2)) "S6")
(if (= PT_S6 nil)
(setq PT_S6 (cdr (nth (1+ index) OBJ_2)))
)
)

(setq index (1+ index))

) ;repeat

; Si la coordonnée du port existe alors on trace une ligne d'axe
; du point d'insertion ou point du port

(if (and (/= pt_s1 nil) (> (distance pt_10 pt_s1) 0))
(command "_line" pt_10 pt_s1 "")
)

(if (and (/= pt_s2 nil) (> (distance pt_10 pt_s2) 0))
(command "_line" pt_10 pt_s2 "")
)

(if (and (/= pt_s3 nil) (> (distance pt_10 pt_s3) 0))
(command "_line" pt_10 pt_s3 "")
)

(if (and (/= pt_s4 nil) (> (distance pt_10 pt_s4) 0))
(command "_line" pt_10 pt_s4 "")
)

(if (and (/= pt_s5 nil) (> (distance pt_10 pt_s5) 0))
(command "_line" pt_10 pt_s5 "")
)

(if (and (/= pt_s6 nil) (> (distance pt_10 pt_s6) 0))
(command "_line" pt_10 pt_s6 "")
)

)
) ;if

(princ)

) ;defun

;|
Efface tous les objets placés sur le calque "AP3D_Axes_Tuyauterie"
|;

(defun c:AP3D_EffacerAxesT ()

(command "_erase"
(ssget "x" (list (cons 8 "AP3D_Axes_Tuyauterie")))
""
)
(princ)
)

Convertir des blocs AutoCAD en équipements divers Plant 3D

La création d’un équipement ne nécessite pas obligatoirement des objets 3D. Une simple ligne peut être convertie en équipement. Ce qui veut dire que si on effectue des filtres de recherche sur des calques, des matériaux et autres il y a peut être un risque de se retrouver avec des conversions incohérentes sauf si un calque ou un type de matériaux correspond à un ensemble d’objet pour un et un seul équipement.

Toutefois la sélection en masse pour la création d’équipements est possible car la commande « _-PlantEquipmentConvert » peut être utilisée en tant que ligne de commande pour qu’elle n’ouvre pas la fenêtre de sélection de la classe..

Voici un petit programme AutoLisp vite fait qui converti une sélection de blocs AutoCAD  en « Equipement divers » Plant 3D.

;; Conversion blocs en équipement divers Plant 3D
;; Dominique VAQUAND 22.05.2020
;; www.dominique-vaquand.com

(defun c:Ap3D_BlocsEnEquipementDivers ( / SelectionObjets Index Bloc_Ent Bloc_Position)

(princ « \nBlocs à convertir en équipement divers Plant 3D: « )
(setq SelectionObjets (ssget (list (cons 0 « INSERT ») )))

(setq Index 0)

(repeat (sslength SelectionObjets)
(setq Bloc_Ent (ssname SelectionObjets index))
(setq Bloc_Position (cdr (assoc 10 (entget Bloc_Ent))))
(command « _-PlantEquipmentConvert » Bloc_Ent «  » « _MiscEquipment » Bloc_Position)
(setq index (1+ index))
)
(princ)
)

AP3_BlocsEnEquipementDivers.zip

***************************************************************************

Mise à jour des vues orthographiques

Vous avez peut-être constaté que la mise à jour des vues orthographiques ne se faisait que vue par vue au risque d’oublier de mettre à jour une vue si la mise en page en contient beaucoup.

Voici un petit programme AutoLisp qui sélectionne toutes les fenêtres de la mise en page et les met à jour en fonction de la modélisation 3D.

Si la modélisation 3D n’a pas été sauvegardée au préalable, un message apparaîtra pour vous demander de confirmer ou non la mise à jour de la fenêtre, sinon la mise à jour se fera automatiquement en n’oubliant aucune fenêtre.

Si une nomenclature existe, elle se mettra également à jour.

Voici le code du programme :


;;; Mise à jour des fenêtres de vues orthographiques
;;; Dominique VAQUAND 04.07.2020
;;; www.dominique-vaquand.com

(defun c:AP3D_MajVueOrtho (/ i ii Select_Fenetres Select_Nomenclatures Ent_F Ent_N)

(if (setq i -1 Select_Fenetres (ssget "_X" '((0 . "VIEWPORT"))))
(while (setq Ent_F (ssname Select_Fenetres (setq i (1+ i))))
(command "_PLANTORTHOUPDATE" Ent_F)
)
)
;; Normalement la nomenclature est mise à jour dès que la fenêtre l'a été.
;; Deux précautions valent mieux qu'une, on met à jour les nomenclatures!
(if (setq ii -1 Select_Nomenclatures (ssget "_X" '((0 . "ACAD_TABLE"))))
(while (setq Ent_N (ssname Select_Nomenclatures (setq ii (1+ ii))))
(command "_PLANTORTHOUPDATEBOM" Ent_N)
)
)

(princ)
)

AP3D_MajVueOrtho

***************************************************************************

Gérer les objets invisibles

Lorsqu’on rend invisible des objets par la commande PLANTHIDE il est difficile, voir même impossible de savoir quel sont les objets concernés
et combien il y en a.

Voici la commande AP3_LISTEDESOBJETSCACHES qui permet de lister tous ces objets là, de les localiser et même d’en rendre certains visibles.

Gerer les objets invisibles

***************************************************************************

AP3D Liste des fichiers DWG d’un projet AutoCAD Plant 3D

L’application AP3D_ListeDesDwgDunProjet permet de lister tous les fichiers DWG contenu dans un projet AutoCAD Plant 3D, de visualiser les indices de révisions (s’ils ont été notés), les auteurs et les dates d’enregistrement.

Une sortie d’un état avec impression ou PDF est possible.

Cette application fonctionne sur des projets créés sur une base de données SQLite et ne nécessite pas AutoCAD Plant 3D.

AP3D_ListeDesDwgDunProjet_SQLite