-
Compteur de contenus
12 247 -
Inscription
-
Dernière visite
-
Jours gagnés
209
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par (gile)
-
[Résolu] Bloc 3D créer dans un SCU non général
(gile) a répondu à un(e) sujet de Steven dans AutoCAD 3D
Attention, avec le LISP qui redéfinit toutes les définitions (réponse #5), le blocs imbriquée (poignées, roulettes) vont subir la rotation dans les blocs parents, ce qui n'est pas souhaitable. À mon avis le plus sûr serait d'insérer les blocs devant subir la rotation dans un dessin vierge avec le Design Center, puis d'utiliser le LISP de la réponse #7 en sélectionnant tous les blocs insérés. -
Inserer Bloc Avec des Attributs Paramétrables
(gile) a répondu à un(e) sujet de Topheur dans AutoCAD 2014
Salut, Attention à la valeur de la variable système ATTREQ quand on insère des blocs avec attributs par (command "_.insert" ...) -
[Résolu] Bloc 3D créer dans un SCU non général
(gile) a répondu à un(e) sujet de Steven dans AutoCAD 3D
Ou, plus simplement, si les références des blocs à traiter sont insérées dans le dessin, en les sélectionnant (encore une fois, ce sont les définitions de bloc qui sont traitées). (defun c:BASCULEBLOC (/ ss doc name lst) (if (ssget '((0 . "INSERT"))) (progn (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-for obj (setq ss (vla-get-ActiveSelectionSet doc)) (if (not (member (setq name (vla-get-Name obj)) lst)) (setq lst (cons name lst)) ) ) (vla-Delete ss) (vlax-for blk (vla-get-Blocks doc) (if (member (vla-get-Name blk) lst) (vlax-for obj blk (vla-TransformBy obj (vlax-tmatrix '((1. 0. 0. 0.) (0. 0. -1. 0.) (0. 1. 0. 0.) (0. 0. 0. 1.) ) ) ) ) ) ) (vla-Regen doc acActiveViewport) ) ) (princ) ) -
[Résolu] Bloc 3D créer dans un SCU non général
(gile) a répondu à un(e) sujet de Steven dans AutoCAD 3D
Oupss, il y a des blocs imbriqués (les poignées et les roulettes) dans le bloc exemple et le LISP ci-dessus risque de donner résultats inattendus. Il faudrait un critère dans les nom de bloc pour différencier les définitions de bloc à traiter (ou ceux à éviter). -
[Résolu] Bloc 3D créer dans un SCU non général
(gile) a répondu à un(e) sujet de Steven dans AutoCAD 3D
Ce LISP devrait traiter toutes les définitions de bloc du dessin (defun c:BASCULEBLOC (/ doc) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-for blk (vla-get-Blocks doc) (if (= :vlax-false (vla-get-IsLayout blk) (vla-get-IsXref blk)) (vlax-for obj blk (vla-TransformBy obj (vlax-tmatrix '((1. 0. 0. 0.) (0. 0. -1. 0.) (0. 1. 0. 0.) (0. 0. 0. 1.) ) ) ) ) ) ) (vla-Regen doc acActiveViewport) (princ) ) -
[Résolu] Bloc 3D créer dans un SCU non général
(gile) a répondu à un(e) sujet de Steven dans AutoCAD 3D
Salut, Si tous les blocs ont la même orientation que celui en exemple et que ce sont des DWG séparés, tu peux utiliser SuperAutoScript avec un script qui leur fait faire une rotation 3d sur X de 90° : _ROTATE3D _all _X 0,0,0 90 -
Transfert de blocs d'un dessin à l'autre
(gile) a répondu à un(e) sujet de Ety dans AutoCAD trucs et astuces
C'est très étonnant parce que c'est précisément la fonction du Design Center. Pourrais-tu préciser ce qui ne marche pas. -
Salut, AutoLISP s'appuie essentiellement sur les données DXF pour accéder aux propriétés des objets mais aussi pour créer des entités (entmake(x)), les modifier (entmod) et les sélectionner (filtres de sélection). On obtient les donnes DXF d'un objet AutoCAD sous la forme d'une liste associative retournée par la fonction entget. Pour une entité graphique, il suffit faire : (entget (car (entsel)))et de sélectionner une entité. En consultant la liste retournée, le deuxième élément est une paire pointée avec un code groupe 0 qui correspond au type d'entité du style : (0 . "OLE2FRAME").
-
Ouvrir AutoCAD avec WPF
(gile) a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Salut, Comme je ne sais pas ce que tu entends par : "ça ne fonctionne pas", je te donne un exemple simple qui fonctionne (en tous cas chez moi). Le fait d'utiliser la liaison tardive (late binding) avec le type dynamic permet de ne pas avoir à référencer les bibliothèque COM qui sont dépendantes des versions majeures d'AutoCAD et de la plateforme. L'inconvénient, c'est qu'on a plus d'intellisense, mais pour ce genre de test ça suffit bien. public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void OpenAcad(object sender, RoutedEventArgs e) { const string productid = "AutoCAD.Application.22"; dynamic acApp; try { acApp = Marshal.GetActiveObject(productid); } catch { try { acApp = Activator.CreateInstance(Type.GetTypeFromProgID(productid), true); } catch { MessageBox.Show("Cannot create object of type \"" + productid + "\""); return; } } // boucle tant qu'AutoCAD n'est pas démarré et visible while (true) { try { acApp.Visible = true; break; } catch { } } // maximise la fenêtre AutoCAD acApp.WindowState = 3; // AcWindowState.acMax; } } -
Modifier un texte dans plusieurs présentation
(gile) a répondu à un(e) sujet de AutoKad dans Personnalisation, macros, DIESEL
Comme je dis dans mon message, tu fais une copie d'un DWG à traiter dans laquelle tu testes le script. -
selection polyligne 3D et insertion de bloc dynamique avec champs
(gile) a répondu à un(e) sujet de kaisho dans LISP et Visual LISP
Le même code avec quelques commentaires : (defun c:test (/ *error* getVertices entity vla-object activeSpace) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) ;; redéfinition locale de la fonction *error* (defun *error* (msg) (and msg (/= msg "Fonction annulée") (prompt (strcat "\nErreur: " msg)) ) (vla-EndUndoMark *acdoc*) (princ) ) ;; obtient tous les sommets d'une polyligne 3d (defun getVertices (poly3d / loop) (defun loop (lst) (if lst (cons (list (car lst) (cadr lst) (caddr lst)) (loop (cdddr lst))) ) ) (loop (vlax-get poly3d 'Coordinates)) ) ;; fonction principale (if (and (setq entity (car (entsel "\nSélectionnez une polyligne 3d: "))) (= (vla-get-ObjectName (setq vla-object (vlax-ename->vla-object entity))) "AcDb3dPolyline") ) (progn (vla-StartUndoMark *acdoc*) (setq activeSpace (vla-get-Block (vla-get-ActiveLayout *acdoc*))) ;; pour chaque sommet de la polyligne 3d sélectionnée (foreach pt (getVertices vla-object) ;; insertion du bloc (vla-InsertBlock activeSpace ; <- espace courant (vlax-3d-point pt) ; <- point d'insertion "ETI-1-200" ; <- nom du bloc 1.0 ; <- échelle en X 1.0 ; <- échelle en Y 1.0 ; <- échelle en Z 0.0 ; <- rotation ) ) ) ) (*error* nil) ) -
selection polyligne 3D et insertion de bloc dynamique avec champs
(gile) a répondu à un(e) sujet de kaisho dans LISP et Visual LISP
Salut, Il y a un problème pour joindre des fichiers sur CADxp. Tu dois passer par un hébergeur. Pour ton LISP, il n'y a rien de compliqué si le bloc est bien fait à savoir que l'attribut avec le champ pour l'altitude ait été créé dans l'éditeur de bloc avec le type de champ : EspaceRéservéBloc et la propriété de la référence de bloc = Position avec uniquement Z coché. Ensuite, tu peux t'inspirer du LISP suivant : (defun c:test (/ *error* getVertices entity vla-object activeSpace) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (defun *error* (msg) (and msg (/= msg "Fonction annulée") (prompt (strcat "\nErreur: " msg)) ) (vla-EndUndoMark *acdoc*) (princ) ) (defun getVertices (poly3d / loop) (defun loop (lst) (if lst (cons (list (car lst) (cadr lst) (caddr lst)) (loop (cdddr lst))) ) ) (loop (vlax-get poly3d 'Coordinates)) ) (if (and (setq entity (car (entsel "\nSélectionnez une polyligne 3d: "))) (= (vla-get-ObjectName (setq vla-object (vlax-ename->vla-object entity))) "AcDb3dPolyline") ) (progn (vla-StartUndoMark *acdoc*) (setq activeSpace (vla-get-Block (vla-get-ActiveLayout *acdoc*))) (foreach pt (getVertices vla-object) (vla-InsertBlock activeSpace (vlax-3d-point pt) "test" 1. 1. 1. 0. ) ) ) ) (*error* nil) ) -
Sélection de bloc par entité sur calque
(gile) a répondu à un(e) sujet de ASTERIXII dans LISP et Visual LISP
Salut, Si j'ai bien compris la demande, le LISP ci-dessous devrait faire l'affaire. L'utilisateur est invité à entrer les noms de calques séparés par des virgules, les caractères génériques sont acceptés. (defun c:ASTERIXII (/ layers block ent filter) (if (setq layers (getstring T "\nEntrez les noms de calques séparé par des virgules: ")) (progn (setq layers (strcase layers) filter "" ) (while (setq block (tblnext "block" (not block))) (setq ent (cdr (assoc -2 block))) (if (< (cdr (assoc 70 block)) 4) (while ent (if (wcmatch (strcase (cdr (assoc 8 (entget ent)))) layers) (setq filter (strcat filter (cdr (assoc 2 block)) ",") ent nil ) (setq ent (entnext ent)) ) ) ) ) (sssetfirst nil (ssget "_X" (list (cons 0 "INSERT") (cons 2 filter)))) ) ) (princ) ) -
Sélectionner des blocks et retirer le nom du block
(gile) a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
BlockReference br = transaction.GetObject(id, OpenMode.ForRead) as BlockReference;retourne null si id n'est pas l'identifiant d'une référence de bloc, ce qui adviendra inévitablement si la présentation contient d'autres entités que des blocs (une fenêtre flottante ou Viewport, par exemple). Ceci provoque immanquablement une erreur de type "La référence d'objet n'est pas définie à une instance d'objet", erreur fatale pour AutoCAD. Tu dois donc faire un test pour voir si br est null avant d'appeler br.BlockName, br.Name, ou mieux, tester le type de id.ObjectClass avant d'ouvrir l'entité. Tu peux aussi tester directement si le Layout pour savoir si c'est l'espace objet (entry.Key == "Model") ce qui évite d'ouvrir le Layout et le BlockTableRecord pour rien. -
Sélectionner des blocks et retirer le nom du block
(gile) a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Oui,ensuite tu ouvres le BlockTableRecord du Layout (layout.BlockTableRecordId), puis tu parcours les entités contenues dans ce BlockTableRecord (toujours avec foreach) à la recherche des références de bloc nommées "CARTOUCHE LU". -
Sélectionner des blocks et retirer le nom du block
(gile) a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Si tu veux de l'aide, commence par essayer de présenter un code un peu plus épuré / optimisé, il sera plus lisible (pour ceux qui te lisent comme pour toi) : Puisque tu initialises une variable database, utilise cette variable dans la suite du code à chaque fois que tu peux. Tu n'as pas besoin de démarrer une nouvelle transaction à chaque itération, utilise simplement la transaction dans laquelle tu es déjà. De même, tu n'as pas besoin de créer une instance BlockTable et du BlockTableRecord "CARTOUCHE LU" à chaque itération. Sinon, du point de vue de la méthode, il semble que tu n'aies pas compris la manière de chercher les références de blocs et que tu mélanges deux approches complètement différentes. Soit tu pars de la définition du bloc "CARTOUCHE LU" et tu obtiens toutes les références insérées dans la dessin avec la méthode GetBlockReferenceIds() que tu devras ensuite trier par Layout en retrouvant le BlockTableRecord propriétaire de chaque référence de bloc avec OwnerId, puis le Layout correspondant à ce BlockTableRecord. Soit tu parcours tous les Layouts depuis le dictionnaire "ACAD_LAYOUT" et, pour chaque Layout, tu ouvres le BlockTableRecord correspondant que tu parcours à son tour pour retrouver les références du bloc "CARTOUCHE LU" qu'il contient. -
Salut, Tu as TotalPerim sur cette page qui fonctionne comme TotalArea. Sinon, beaucoup plus simple, le LISP suivant fonctionne avec les paramètres de texte courants: (defun c:fredel (/ pline) (and (setq pline (car (entsel "\nSélectionnez une polyligne: "))) (= (getpropertyvalue pline "LocalizedName") "Polyligne") (command "_.text" pause "" "" (rtos (/ (getpropertyvalue pline "Length") 1000.))) ) (princ) )
-
fusion DWG 2 dossiers 800 fichiers meme nom
(gile) a répondu à un(e) sujet de metacilla dans AutoCAD 2017
Salt, Dans le chemin du dossier, tu as remplacé les slashes (/) par des anti-slashes (\) et en LISP (comme dans de nombreux langages) l'anti-slash est le caractère d'échappement, il faut donc le doubler dans les chaînes. Tu as aussi remplacé, dans la commande INSERER l'option "*" qui sert à décomposer le bloc par le chemin du dossier. Essaye comme ça : (if (setq fileName (findfile (strcat "H:\\Chantier**\\4_Plans\\Plans globaux\\GAZ et Nom\\" (getvar "DWGNAME")))) (command "_.insert" (strcat "*" fileName) "0,0" 1 0) ) -
Sélectionner des blocks et retirer le nom du block
(gile) a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Les "espaces" sont en fait constitués de deux objets liés : un objet de type Layout qui correspond à la configuration de traçage. Les objets de type Layout sont des entrées du dictionnaire "ACAD_LAYOUT" ; un objet de type BlockTableRecord qui contient les entités graphiques. On retrouve l'objet BlockTableRecord d'un Layout grâce à sa propriété BlockTableRecordId, inversement, on retrouve le Layout associé à un BlockTableRecord (dont la propriété IsLayout == true) via sa propriété LayoutId. -
Sélectionner des blocks et retirer le nom du block
(gile) a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
1. Oui, BlockTable contient tous les blocs que tu peux insérer directement dans ton dessin avec la commande INSERT. Quand tu choisis l'option "Parcourir" de la commande INSERT et que tu choisis un fichier DWG, AutoCAD crée une nouvelle définition de bloc (BlockTableRecord) dans la table des blocs du dessin (BlockTable) avec le contenu de l'espace objet du fichier sélectionné et, si la commande aboutit, insère une référence à cette nouvelle définition (si on fait Echap au lieu de spécifier le point d'insertion, la définition est ajoutée à la table mais aucune référence n'est insérée). 2. L'espace papier est de type BlockTableRecord et peut contenir des entités graphiques (Entity) comme des lignes (Line), des polylignes (Polyline), etc. ainsi que des références de bloc (BlockReference). Les objets de type BlockReference ne "contiennent" pas d'entités stricto sensu, ce sont juste des références à une définition qui, elle, contient ces entités. Pour les attributs, c'est un peu particulier. La définition de bloc peut contenir des définitions d'attribut (entités de type AttributeDefinition). Ces définitions d'attributs sont, en quelque sorte, des modèles ou gabarits qui sont utilisés pour la création de références d'attributs (AttributeReference)*. Ce sont ces références d'attribut qui sont liées à une référence de bloc et qu'on retrouve grâce à la propriété AttributeCollection de la référence de bloc. * Avec .NET, comme avec AutoLISP et la fonction entmake, quand on insère une nouvelle référence de bloc qui a des attributs, il faut explicitement créer les références d'attribut et les ajouter à la collection d'attributs de la nouvelle référence. La commande INSERT comme la méthode COM/ActiveX InsertBlock() font ça implicitement et masquent donc tout ce processus à l'utilisateur. -
Modifier un texte dans plusieurs présentation
(gile) a répondu à un(e) sujet de AutoKad dans Personnalisation, macros, DIESEL
Il faut d'abord que tu fasses (si ce n'est déjà fait) un "fichier bloc" à partir du bloc "Cartouche" à modifier avec la commande WBLOC > cocher "Bloc" > choisir le bloc dans la liste déroulante > enregistrer dans un répertoire des chemins de recherche sous "Cartouche.dwg". Tu ouvres ce fichier "Cartouche.dwg" et tu modifies le texte et l'image et tu l'enregistres. Ensuite, tu mets au point ton script dans un des dessins à modifier (ou plus prudemment une copie) en faisant bien attention aux espaces et retour chariot qui sont autant de validations. Quelque chose du genre : _.INSERT "Cartouche=Cartouche.dwg" 0,0 1 1 0 _.ERASE _last Quand ton script est au point tu l'utilises avec SAS. -
Modifier un texte dans plusieurs présentation
(gile) a répondu à un(e) sujet de AutoKad dans Personnalisation, macros, DIESEL
Salut, Si le cartouche est un bloc qui contient le texte à changer et le logo, il devrait être possible de redéfinir ce bloc de manière scriptable avec l'option "nom_bloc=fichier_bloc.dwg" de la commande -inserer. -
Salut, Je ne sais pas si ce que tu veux faire est possible (je n'ai jamais essayé). En tous cas, il me semble que c'est dans la surcharge de la méthode WorlDraw() de ton SelectionJig que ça devrait se passer. D'autre part, le code que tu as posté ne me semble pas très robuste. Tu utilises des instances de Entity hors de la portée de la transaction qui a servi a les ouvrir. Quand tu appelles tr.Dispose() (ce qui, par ailleurs est redondant avec le End Using suivant), tu appelles aussi Dispose sur tous les objets ouverts avec cette transaction (les entités contenues dans ents). Utiliser ces objets après cela risque de provoquer une exception (voire une erreur fatale) si le Garbage Collector a libéré leurs ressources entre temps.
-
Sélection bloc par valeur d'attribut
(gile) a répondu à un(e) sujet de Begood dans LISP et Visual LISP
Salut, Regarde la fonction wcmatch, c'est une méthode équivalente qui est utilisée pour le nom du bloc dans le filtre de sélection. (if (wcmatch (vla-get-Effectivename (vlax-ename->vla-object ent)) "Bulle,Bulle Alu") -
[Résolu] Mettre à jour une entité avant (pendant/après) la sauvegarde
(gile) a répondu à un(e) sujet de Olivier Eckmann dans ObjectARX/DBX, C++, .NET, RealDWG
Salut, Tu devrait pouvoir gérer l'événement Database.BeginSave.
