-
Compteur de contenus
12 247 -
Inscription
-
Dernière visite
-
Jours gagnés
208
(gile) a gagné pour la dernière fois le 4 juin
(gile) a eu le contenu le plus aimé !
À propos de (gile)

Contact Methods
-
AIM
1
-
Website URL
https://gilecad.azurewebsites.net/Default.aspx
-
Yahoo
0
Profile Information
-
Gender
Not Telling
Visiteurs récents du profil
Le bloc de visiteurs récents est désactivé et il n’est pas visible pour les autres utilisateurs.
(gile)'s Achievements
-
Si vraiment tu veux travailler en 3d (concevoir et modéliser des pièces, les assembler, puis sortir des plans côtés depuis la modélisation), il vaut mieux utiliser un autre logiciel que AutoCAD qui, même s'il permet des faire des choses en 3d, est avant tout un logiciel de dessin (2d). Je connais très mal Revit et ne peux donc te dire s'il est adapté pour de la menuiserie. Je connais un peu mieux Inventor. C'est un logiciel plutôt dédié à la mécanique mais qui pourrait très bien servir en menuiserie (il existe des extension spécifiques). Inventor possède un puissant modeleur 3d paramétrique assez facile à prendre en main pour concevoir et modéliser les différentes pièces puis les assembler entre elles grâce à un système de contraintes et même de mettre en mouvement ces assemblages. Les sorties de plans, coupes, éclatés, etc se font ensuite en quelques clics. Mais d'après ce que tu décris, je ne suis pas certain que ce processus de travail soit justifié. Si vraiment le client a besoin d'une 3d pour une vision synthétique globale, une 3d schématique faite avec Sketchup est suffisante.
-
Ça ne marchera pas mieux. LXL crée une liaison entre des blocs et Excel et c'est dans le LISP qu'il y a les fonctions pour accéder à Excel, fonctions qui ne sont pas utilisables avec une version LT.
-
Salut, Je pense que non. LXL utilise une connexion à une application externe (Excel) ce qui est précisément la limitation du LISP avec les versions LT.
-
Salut, La menuiserie est un vaste domaine et l'utilisation d'AutoCAD dans ce cadre ne l'est pas moins. Pour pouvoir t'aider, il faudrait plus de détails sur ce que tu fais précisément avec AutoCAD dans ton travail. Par exemple à quoi sert la 3D ? À ma connaissance, en fabrication tout du moins, les coupes et plans 2D sont suffisants (à part utiliser de l'impression 3D).
-
Le premier argument de setpropertyvalue doit être le nom d'entité (ename) de l'objet à modifier. Dans le cas présent, il s'agit de la référence de bloc qui vient d'être insérée qu'on peut obtenir avec la fonction entlast qui renvoie la dernière entité créée. (command "-INSERER" "ECLATE_PI_1" pt1 1 "" 0 "") (setq bloc (entlast)) (setpropertyvalue bloc "AcDbDynBlockPropertyVisibilité1" "Te à 3 emboitements")
-
Salut, La façon la plus simple, à mon avis, pour modifier les propriétés dynamiques d'un bloc est d'utiliser la fonction setpropertyvalue. La syntaxe est la suivante(remplacer les textes en gras par les valeurs correspondantes : (setpropertyvalue ename_du_bloc "AcDbDynBlockProperty<nom_de_la_propriété_dynamique>" valeur_de_la_propriété) Par exemple, avec ton bloc : (setpropertyvalue bloc "AcDbDynBlockPropertyVisibilité1" "Te à 3 emboitements")
-
C'était le but, comme d'éviter d'utiliser une image (fichier externe). J'ai ajouté la possibilité d'entrer du texte multiligne.
-
Ce n'est pas le premier plug-in pour créer des QR Code dans AutoCAD, mais celui-ci permet d'insérer un bloc (éventuellement anonyme, donc non modifiable via l'éditeur de blocs). Le bloc contient juste une hachure qui représente le QR Code sur fond blanc et, optionnellement un attribut constant avec le texte d'origine. La commande QRCODEINSERT affiche une boite de dialogue pour définir les paramètres d'encodage et les propriétés du bloc inséré. Le code source, qui utilise la bibliothèque QRCoder, est disponible sur GitHub. Télécharger InsertQRCodeBlockSetup.msi pour installer le plug-in (compatible avec toutes les version pleines ou verticales d'AutoCAD depuis 2013).
-
Onglets de présentation en palette
(gile) a répondu à un(e) sujet de La Lozère dans AutoCAD 2020-2024
Salut, Il m'a semblé que la question pouvait être un bon exemple pour une palette C#/WPF. Télécharger LayoutPaletteSetup.msi. Débloquer le fichier et lancer l'installation. La commande LAYOUTS affiche la palette (compatible toutes versions d'AutoCAD pleines ou verticales depuis 2013). Pour ceux que ça intéresse, le code (de plus amples explications à propos des interfaces utilisateur en .NET sur cette page). La classe CustomPaletteSet définit un jeu de palette. using Autodesk.AutoCAD.Windows; using System; using AcCoreAp = Autodesk.AutoCAD.ApplicationServices.Core.Application; namespace LayoutPaletteNetCore { internal class CustomPaletteSet : PaletteSet { static bool wasVisible; public CustomPaletteSet() : base("Layouts", "LAYOUTS", new Guid("{92007042-8476-48DB-9003-AD5AA0E47C98}")) { Style = PaletteSetStyles.ShowAutoHideButton | PaletteSetStyles.ShowCloseButton | PaletteSetStyles.ShowPropertiesMenu; MinimumSize = new System.Drawing.Size(150, 450); AddVisual("Layouts", new LayoutControl()); var docs = AcCoreAp.DocumentManager; docs.DocumentBecameCurrent += (s, e) => Visible = e.Document != null && wasVisible; docs.DocumentCreated += (s, e) => Visible = wasVisible; docs.DocumentToBeDeactivated += (s, e) => wasVisible = Visible; docs.DocumentToBeDestroyed += (s, e) => { wasVisible = Visible; if (docs.Count == 1) Visible = false; }; } } } Le fichier PaletteControl.xaml définit le contrôle WPF (palette) <UserControl x:Class="LayoutPaletteNetCore.LayoutControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:LayoutPaletteNetCore" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <Grid Background="WhiteSmoke"> <ListBox Margin="5" ItemsSource="{Binding LayoutList}" SelectionMode="Single" SelectedItem="{Binding CurrentLayout}"/> </Grid> </UserControl> Le fichier PaletteControl.xaml.cs définit la logique d'interaction du contrôle using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using System.Collections; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Threading.Tasks; using System.Windows.Controls; using AcCoreAp = Autodesk.AutoCAD.ApplicationServices.Core.Application; namespace LayoutPaletteNetCore { public partial class LayoutControl : UserControl, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void NotifyPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); private string currentLayout; public ObservableCollection<string> LayoutList { get; private set; } public string CurrentLayout { get { return currentLayout; } set { currentLayout = value; SetCurrentLayout(); NotifyPropertyChanged(nameof(CurrentLayout)); } } public LayoutControl() { InitializeComponent(); DataContext = this; LayoutList = new ObservableCollection<string>(); AcCoreAp.DocumentManager.DocumentActivated += OnDocumentActivated; var doc = AcCoreAp.DocumentManager.MdiActiveDocument; if (doc != null) { UpdateLayouts(); HandleEvents(LayoutManager.Current); } } private async void SetCurrentLayout() { var docs = AcCoreAp.DocumentManager; await docs.ExecuteInCommandContextAsync( (_) => { LayoutManager.Current.CurrentLayout = CurrentLayout; return Task.CompletedTask; }, null); } private void OnDocumentActivated(object sender, DocumentCollectionEventArgs e) { UpdateLayouts(); HandleEvents(LayoutManager.Current); } private void HandleEvents(LayoutManager layoutManager) { layoutManager.LayoutCopied += (_, _1) => UpdateLayouts(); layoutManager.LayoutCreated += (_, _1) => UpdateLayouts(); layoutManager.LayoutRemoved += (_, _1) => UpdateLayouts(); layoutManager.LayoutRenamed += (_, _1) => UpdateLayouts(); layoutManager.LayoutsReordered += (_, _1) => UpdateLayouts(); layoutManager.LayoutSwitched += (_, _1) => CurrentLayout = layoutManager.CurrentLayout; } private void UpdateLayouts() { var db = HostApplicationServices.WorkingDatabase; using (var tr = new OpenCloseTransaction()) { LayoutList.Clear(); var layouts = ((DBDictionary)tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead)) .Cast<DictionaryEntry>() .Select(e => (Layout)tr.GetObject((ObjectId)e.Value, OpenMode.ForRead)) .OrderBy(l => l.TabOrder) .Select(l => l.LayoutName); foreach (string layoutName in layouts) { LayoutList.Add(layoutName); } CurrentLayout = LayoutManager.Current.CurrentLayout; } } } } La commande pour afficher la palette. using Autodesk.AutoCAD.Runtime; [assembly: CommandClass(typeof(LayoutPaletteNetCore.Commands))] namespace LayoutPaletteNetCore { public class Commands { static CustomPaletteSet palette; [CommandMethod("LAYOUTS")] public static void ShowLayoutsPalette() { if (palette == null) { palette = new CustomPaletteSet(); } palette.Visible = true; } } } -
Créer une sélection avec la sélection précédente et laisser la main a l'utilisateur pour compléter la sélection.
(gile) a répondu à un(e) sujet de Jon dans Débuter en LISP
Si on "aplatit" les imbrications (LISP n'est qu'imbrications) et qu'on ajoute quelques commentaires. ;; initialise i au nombre d'objets sélectionnés (setq i (sslength ss2)) ;; répète autant de fois qu'il y a d'objets sélectionnés (repeat i ;; décremente i (setq i (1- i)) ;; récupère l'objet à l'indice i de la sélection (setq ent (ssname ss2 i)) ;; ajoute l'objet à l'autre jeu de sélection (ssadd ent ss) ) Exemple avec 3 objets sélectionnés : i est initialisé à 3 on répète 3 fois la séquence, soit : 1. on décrémente i (i = 2), on récupère le troisième objet (indice 2) et on l'ajoute à l'autre sélection. 2. on décrémente i (i = 1), on récupère le deuxième objet (indice 1) et on l'ajoute à l'autre sélection. 3. on décrémente i (i = 0), on récupère le premier objet (indice 0) et on l'ajoute à l'autre sélection. Si on reprend ce code (sans commentaires) (setq i (sslength ss2)) (repeat i (setq i (1- i)) (setq ent (ssname ss2 i)) (ssadd ent ss) ) Comme la fonction setq renvoie la valeur qui est assignée au symbole, on peut remplace le premier appel à i dans (repeat i...) par l'expression de son initialisation : (repeat (setq i (sslength ss2)) (setq i (1- i)) (setq ent (ssname ss2 i)) (ssadd ent ss) ) de même, on peut remplacer l'appel à i dans l'expression (ssname ...) par l'expression qui décrémente sa valeur : (repeat (setq i (sslength ss2)) (setq ent (ssname ss2 (setq i (1- i)))) (ssadd ent ss) ) et, pour finir, remplacer ent dans l'expression (ssadd ...) par l'expression qui assigne sa valeur au symbole 'ent' désormais inutile. sa valeur: (repeat (setq i (sslength ss2)) (ssadd (ssname ss2 (setq i (1- i))) ss) ) -
Créer une sélection avec la sélection précédente et laisser la main a l'utilisateur pour compléter la sélection.
(gile) a répondu à un(e) sujet de Jon dans Débuter en LISP
Si la variable système PICKFIRST et à 1 (défaut) et qu'il y a des objets sélectionnés (ssget) les prend automatiquement comme (ssget "_I") ; s'il n'y a pas d'objets sélectionnés, l'utilisateur est invité sélectionner des objets. En pratique, quand on entre TEST, s'il y a des objets sélectionnés, ils sont stockés dans ss s'il n'y a pas d'objets sélectionnés, l'utilisateur est invité faire une sélection qui est stockée dans ss et on fait le panoramique Puis, l'utilisateur est invité faire une nouvelle sélection (ss2) et les objets de cette sélection sont ajoutés à ss. Une version commentée : (defun c:test (/ pickfirst ss ss2) ;; stocke la valeur courante de PICKFIRST (setq pickfirst (getvar "PICKFIRST")) ;; force PICKFIRST à 1 (setvar "PICKFIRST" 1) (prompt "\nRez de chaussée.") ;; récupère la sélection active ou invite l'utilisateur à faire une sélection (if (setq ss (ssget)) (progn ;; fait le panoramique (command-s "-pan" "0,0,0" "0,-100,0") (prompt "\nPremier étage.") ;; invite l'utilisateur à faire une nouvelle sélection (if (setq ss2 (ssget)) ;; ajoute les objets sélectionnés à la première sélection (repeat (setq i (sslength ss2)) (ssadd (ssname ss2 (setq i (1- i))) ss) ) ) ;; active (grippe) l'ensemble des objets sélectionnés (sssetfirst nil ss) ) ) ;; restaure la valeur initiale de PICKFIRST (setvar "PICKFIRST" pickfirst) (princ) ) -
Créer une sélection avec la sélection précédente et laisser la main a l'utilisateur pour compléter la sélection.
(gile) a répondu à un(e) sujet de Jon dans Débuter en LISP
Salut, Tu peux utiliser ssadd pour ajouter des entités à un jeu de sélection. (defun c:test (/ ss ss2) (if (setq ss (ssget)) (progn (command-s "-pan" "0,0,0" "0,-100,0") (if (setq ss2 (ssget)) (repeat (setq i (sslength ss2)) (ssadd (ssname ss2 (setq i (1- i))) ss) ) ) (sssetfirst nil ss) ) ) (princ) ) -
Autocad <-> Python <-> L' infini et au-delà
(gile) a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
PyAutoCAD utilise l'API COM/ActiveX (l'API du VBA AutoCAD, accessible aussi en LISP, NET ou ObjectARX). Les possibilités (et les limites) concernant AutoCAD sont donc les mêmes qu'avec le VBA AutoCAD. -
Objet en avant ou en arrière plan
(gile) a répondu à un(e) sujet de Siham2432 dans LISP et Visual LISP
Les deux font exactement la même chose (définition des commandes LISP TOP et BOT). Le premier est une sorte d'exercice de style, le second est (peut-être) plus facilement compréhensible. -
Objet en avant ou en arrière plan
(gile) a répondu à un(e) sujet de Siham2432 dans LISP et Visual LISP
Je suis parti de l'ancien code, mais j'aurais pu (dû) écrire de façon moins cryptique : (defun DrawOrderByLayer (fun / ent doc blocks layer sort lst var) (vl-load-com) (and (setq ent (car (entsel "\nSélectionnez un objet sur le calque cible: "))) (SETQ doc (vla-get-ActiveDocument (vlax-get-acad-object)) blocks (vla-get-Blocks doc) layer (cdr (assoc 8 (entget ent))) ) (not (vla-StartUndoMark doc)) (vlax-for b blocks (or (not (vl-catch-all-error-p (setq sort (vl-catch-all-apply 'vla-GetObject (list (vla-GetExtensionDictionary b) "ACAD_SORTENTS") ) ) ) ) (setq sort (vla-AddObject (vla-GetExtensionDictionary b) "ACAD_SORTENTS" "AcDbSortentsTable" ) ) ) (setq lst nil) (vlax-for obj b (if (= (vla-get-Layer obj) layer) (setq lst (cons obj lst)) ) ) (if lst (fun sort (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbObject (cons 0 (1- (length lst)))) lst ) ) ) ) ) ) (vla-EndUndoMark doc) (vla-Regen doc acActiveViewport) (princ) ) (defun c:TOP () (DrawOrderByLayer vla-MoveToTop)) (defun c:BOT () (DrawOrderByLayer vla-MoveToBottom))
