Aller au contenu

(gile)

Moderateurs
  • 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

Proficient

Proficient (10/14)

  • Well Followed Rare
  • Very Popular Rare
  • Conversation Starter Rare
  • Reacting Well Rare
  • Posting Machine Rare

Recent Badges

411

Réputation sur la communauté

  1. 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.
  2. (gile)

    Lisp LXL autocad 2026

    Ç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.
  3. (gile)

    Lisp LXL autocad 2026

    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.
  4. 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).
  5. 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")
  6. 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")
  7. (gile)

    QR Code

    C'était le but, comme d'éviter d'utiliser une image (fichier externe). J'ai ajouté la possibilité d'entrer du texte multiligne.
  8. 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).
  9. 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; } } }
  10. 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) )
  11. 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) )
  12. 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) )
  13. 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.
  14. 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.
  15. 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))
×
×
  • 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é