Aller au contenu

Maxence DELANNOY

Membres
  • Compteur de contenus

    140
  • Inscription

  • Dernière visite

Tout ce qui a été posté par Maxence DELANNOY

  1. Je pense que ce n'est pas implémenté directement dans la bibliothèque géométrique pour des raisons d'optimisation. Si c'était fait dans IntersectWith, qui est utilisé par exemple pour l'accrochage aux objets, ça risquerait d'avoir un impact négatif sur les performances d'AutoCAD.
  2. Tiens c'est marrant j'ai eu le même problème hier. Est-ce que par hasard les coordonnées de tes entités sont très grandes (genre 7 chiffres ou plus devant la virgule) ? Si oui, essaie de ramener tes entités à proximité de l'origine du SCG avec une translation, calcule ton intersection, puis rétablit tes entités à leur position de départ. Tu dois évidemment aussi transformer les points d'intersection renvoyés par IntersectWith pour obtenir leurs positions réelles. C'est peut être un problème de stabilité numérique des fonctions géométrique d'AutoCAD.
  3. Il n'y a rien à ma connaissance pour cela dans Revit, mais ça peut être fait avec une macro VSTA ou via un complément. Voilà par exemple un bout de code qui maximise la fenêtre revit sur l'ensemble des écrans : [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] class MultiScreenMaximizeCommand : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { int minX = int.MaxValue; int minY = int.MaxValue; int allScreensWidth = 0; int allScreensMinHeight = int.MaxValue; foreach (Screen screen in Screen.AllScreens) { minX = Math.Min(minX, screen.WorkingArea.X); minY = Math.Min(minY, screen.WorkingArea.Y); allScreensWidth += screen.WorkingArea.Width; allScreensMinHeight = Math.Min(allScreensMinHeight, screen.WorkingArea.Height); } NativeMethods.MoveWindow(ComponentManager.ApplicationWindow, minX, minY, allScreensWidth, allScreensMinHeight, true); return Result.Succeeded; } } [DllImport("user32.dll", SetLastError = true)] public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); Il faudrait modifier ce code pour qu'il ne considère que 2 de tes 3 écrans, et ensuite gérer le positionnement des fenêtres "enfants".
  4. Maxence DELANNOY

    Table de consultation

    En fait les 2 doivent fonctionner, je crois que Revit lit le premier caractère du fichier pour déterminer le séparateur. Normalement un CSV comme son nom l'indique (Comma Separated Values) utilise la virgule, mais comme c'est normalement le séparateur décimal en France et dans d'autres pays, le point virgule est parfois utilisé également.
  5. Maxence DELANNOY

    Table de consultation

    Tu peux consulter l'aide en Français ici : http://help.autodesk.com/view/RVT/2017/FRA/?guid=GUID-91270AEF-225A-49D7-BF84-1F44D1E3E216 En gros, tout est basé sur la fonction Revit size_lookup. Cette fonction va te permettre de retrouver une valeur à partir d'une autre valeur. Imaginons que dans un raccord de tuyauterie tu as un paramètre Diamètre Nominal. Tu as besoin de retrouver l'épaisseur correspondant à un diamètre particulier. Tu va donc créer un fichier CSV qui ressemblera à ça : ;Diamètre nominal##LENGTH##MILLIMETERS;Epaisseur##LENGTH##MILLIMETERS DN100;100;3.0 DN125;125;3.2 Tu as une ligne d'entête qui comporte 3 entrées séparées par une virgule ou un point virgule. La première entrée est vide, c'est juste un libellé qui te permet de te retrouver dans le fichier. Ici j'ai rempli la colonne avec DN100, DN125. La deuxième entrée est le diamètre. C'est une longueur (LENGTH) en mm (MILLIMETERS). La troisième et dernière entrée correspond à l'épaisseur, qui est également une longueur en mm. En dessous de la ligne d'entête, tu as deux lignes de données. Là aussi, les entrées sont séparées par une virgule ou un point virgule. La première entrée est le libellé, la deuxième une valeur de diamètre et la troisième l'épaisseur correspondant au diamètre. Dans ta famille, tu vas charger ce fichier à l'aide du bouton Gérer les tables de consultation qui est situé en bas à droite de la boite de dialogue Types de familles. Ensuite tu vas utiliser la fonction size_lookup dans tes formules comme ceci : http://imageshack.com/a/img922/5926/EN5xH7.png Le premier argument de cette fonction est le nom de la table/du fichier CSV. Il faut le mettre entre guillemets double. Le deuxième argument c'est le nom de la colonne qui va être lue, le troisième la valeur par défaut et la dernière le paramètre qui va être utilisé pour la recherche (comme c'est un nom de paramètre, pas besoin de guillemets). Donc Revit va parcourir le fichier CSV. Il va chercher dans la 2ème colonne nommée Diamètre nominal la valeur 100. S'il la trouve, size_lookup va retourner la valeur qui se trouve dans la 3ème colonne nommée Epaisseur. S'il ne la trouve pas, size_lookup va retourner la valeur par défaut (1 mm). Les tables de consultation te permettent donc de gérer un grand nombre de combinaisons de valeur sans avoir à créer plusieurs types. Il te suffit de faire varier un ou plusieurs paramètres de recherche et avec size_lookup tu retrouves les valeurs associées.
  6. Il faudrait préciser aussi la release puisque des fonctionnalités peuvent être ajoutées (les paramètres globaux dans la 2016 R2 par exemple). Donc [Revit 2016 R2] par exemple. Maintenant il y a deux releases par an donc le simple numéro de version n'est pas significatif.
  7. Vous pouvez ouvrir des fichiers Revit 2012 et 2013 avec un Revit 2016 ou 2017. Par contre avec un Revit 2017, vous ne pouvez enregistrer qu'en 2017.
  8. Avec COM il y a souvent des soucis, notamment des conflits de version, des composants mal enregistrés dans la base de registre... etc. Attaquer directement le document DOCX/XLSX est souvent plus fiable et plus rapide. Pour le XLSX j'utilise SpreadsheetLight qui est très simple et marche bien (je ne l'ai pas poussé dans ces retranchements mais pour faire des feuilles de calcul ordinaire c'est OK) : http://spreadsheetlight.com/ Pour ce qui est de Word, je n'ai pas souvent besoin de créer ce genre de document, donc je n'ai pas de nom à te donner, mais tu devrais trouver ton bonheur sur Nuget : https://www.nuget.org/ En tout cas, n'attaque pas directement en OpenXML, c'est bien trop lourd. Et pour COM, la compatibilité est ascendante, c'est à dire que si ton client fonctionne avec une ancienne version d'office, il doit fonctionner avec les nouvelles. Donc il faut développer/tester de préférence avec une version ancienne.
  9. Mes clients utilisent systématiquement des murs séparés parce que les murs multicouche ne sont pas assez flexibles. C'est dommage parce qu'effectivement Revit devrait aider à ce niveau, mais la fonctionnalité n'est pas assez aboutie pour qu'elle soit utilisable en pratique.
  10. 1. Tu peux acheter une licence Building Design Suite qui inclus AutoCAD et Revit, ce qui peut se révéler moins cher qu'acheter AutoCAD et un autre logiciel BIM. 2. Je pense que tu peux échanger la géométrie 3D entre Solidworks et Revit avec le format SAT (ACIS). Ca devrait mieux marcher dans le sens Revit -> Solidworks que dans l'autre sens car Revit n'est pas optimisé pour gérer des modèles 3D très détaillés comme on peut les produire dans Solidworks. 3. Tu peux exclure certaines catégories de l'export IFC dans Revit. C'est expliqué ici (en anglais). Après je ne suis pas sur que cela soit pratique/utilisable pour protéger ton IP.
  11. J'ai aussi une MX mais je n'ai pas ce type de problème. Mais je trouve que maintenir la roulette appuyée avec cette souris est relativement difficile. J'ai donc affecté la fonction "Bouton du milieu" au bouton numéro 9 dans le logiciel SetPoint et une fois l'habitude prise, je trouve ça plus pratique.
  12. Si seule la 3D t'intéresse, tu peux également utiliser le format SAT pour exporter/importer tes solides.
  13. Merci pour le lien, je ne connaissais pas ce composant qui peut être vraiment utile.
  14. C'est très clair. Développer une petite macro comme celle là peut prendre plusieurs heures pour un amateur, et quelques heures de plus pour un professionnel qui doit fournir un certain nombre de prestations/garanties supplémentaires. Donc soit tu trouves quelqu'un qui te le feras gracieusement parce que ça l'amuse et qu'il a un peu de temps devant lui à occuper, soit tu dois dégager un budget de quelques centaines d'euros pour le faire développer par une boite spécialisée que tu trouveras aisément en faisant une recherche sur notre ami Google. Sur un problème comme celui-là, ce n'est pas évident car implanter les 1400 platines à la main devrait te prendre quelques jours, si on compare au coût d'un développement, ce n'est pas évident que tu t'y retrouves, sauf si tu dois réitérer l'opération plusieurs fois.
  15. Une surcharge ne marchera que si tu es dans un style visuel autre que filaire 2D. Quand tu es en filaire 2D, Worlddraw n'est appelée que lors d'une régénération. Pour un zoom ou un pan, AutoCAD utilise les données qu'il a en cache et ignore le drapeau DrawableAttributes.RegenDraw. Donc une surcharge ne fonctionnera pas seule. Tu dois combiner avec un événement comme Document.ViewChanged ou autre. Il doit y avoir une astuce car effectivement les poignées/grips ont ce comportement dans n'importe quel style visuel mais je n'ai pas trouvé comment faire la dernière fois que j'ai essayé.
  16. Tu dois lire les données GPS stockées dans l'entête du fichier JPG. Elles doivent se trouver dans le bloc APP1, dans un IFD (Image File Directory). Tu peux trouver une brève description du format JPEG sur Wikipedia : https://en.wikipedia.org/wiki/JPEG et plus d'informations ici : http://www.codeproject.com/Articles/47486/Understanding-and-Reading-Exif-Data En théorie tu dois pouvoir le faire entièrement en LISP avec open/read-char/close sauf que read-char transforme les séquences CR/LF en LF donc ça peut poser le problème pour le décodage. Et comme tu lis un byte à la fois, tu dois gérer à la main l'Endianness. C'est quand même assez compliqué (voir impossible) et ça peut prendre du temps. Sinon tu dois trouver un ActiveX qui est capable de faire ça.
  17. Personnellement je ne modélise pas, mais je sais que certains de mes clients utilisent plusieurs éléments murs parallèles au lieu des murs à structure complexe parce que c'est plus souple à l'usage. De cette façon tu peux par exemple n'afficher que le noyau du mur en créant un filtre qui masque l'isolant et la finition (chose que tu ne peux pas faire malheureusement avec des murs complexes ; sauf en bidouillant avec les couleurs de trait). Les joints sont aussi plus simples à gérer. Les murs sont attachés ensemble de façon à ce que les ouvertures se propagent d'un mur à l'autre. Et pour ce qui est de la hauteur, les murs sont scindés et vont de dalle en dalle mais je ne me souviens plus de la raison exacte. Le sujet m'intéresse car je suis en train de travailler sur des outils pour réaliser les conversions suivantes : mur complexes <-> plusieurs murs.
  18. Je n'ai rien de plus à ajouter... C'est parfait. Merci @Goldorak44.
  19. Rassures toi, tu n'es le seul psychopathe dans la place, je ne sais même pas s'il y a quelqu'un de normal par ici ;) A ma connaissance, il n'y a aucun moyen d'aligner exactement un texte. Il faut le positionner à peu prêt. En pratique ça marche bien, si tu zoomes bien sur la zone, personne ne remarquera un léger décalage. Tu peux aussi créer un outil pour réaliser l'alignement via l'API. Voici le code nécessaire, ça aligne le texte sur le milieu de la diagonale formée par les 2 points sélectionnés : UIDocument uiDoc = commandData.Application.ActiveUIDocument; Document doc = uiDoc.Document; Selection selection = uiDoc.Selection; ICollection<ElementId> ids = selection.GetElementIds(); using (var tr = new Transaction(doc, "Center text")) { if (tr.Start() == TransactionStatus.Started) { foreach (ElementId id in ids) { Element element = doc.GetElement(id); var tn = element as TextNote; if (tn == null) continue; XYZ p1 = selection.PickPoint("First point"); XYZ p2 = selection.PickPoint("Second point"); tn.Coord = (p1 + p2) / 2; tn.get_Parameter(BuiltInParameter.TEXT_ALIGN_HORZ).Set((int) TextAlignFlags.TEF_ALIGN_CENTER); tn.get_Parameter(BuiltInParameter.TEXT_ALIGN_VERT).Set((int) TextAlignFlags.TEF_ALIGN_MIDDLE); } tr.Commit(); } else { throw new UserException("Transaction can not be started."); } } Je le publierai certainement à l'avenir dans un complément mais pour l'instant j'ai d'autres priorités. Tu peux peut-être en faire une macro VSTA. J'ai écrit une introduction à VSTA dans le 1er numéro d'AroBiM : http://arobim.fr/joomla/la-revue/file/4-arobim-001. Je vois sur ton blog que tu essaies au Lisp, tu devrais t'en sortir avec VSTA.
  20. Oui il faut que tu le retire dans le gestionnaire pour qu'il ne s'exécute qu'une fois. En C# : Application.Idle += Application_Idle; void Application_Idle() { try { // ... } finally { Application.Idle -= Application_Idle; } }
  21. Dans ce cas précis, je pense qu'utiliser un gestionnaire sur l'événement Application.Idle serait plus adapté.
  22. Pour ça tu dois générer une bibliothèque statique (.lib) avec ton premier projet : http://www.zealfortechnology.com/2013/08/create-c-program-static-library-visual-studio-2012.html. On parle bien de C, pas de C#. Parce que dans ce dernier cas il faut utiliser des liens dans Visual Studio ou ILMerge.
  23. D'après la doc, il y a une propriété Thickness sur la plupart des objets :
  24. Pour ça tu dois mémoriser une variable booléenne dans une combinaison dictionnaire/XRecord. Ensuite, dans l'événement DocumentBecameCurrent, tu lis cette variable. Si elle n'existe pas, tu désactives la surcharge. Si elle existe et qu'elle est à true, tu l'actives... Ça c'est si tu veux que l'activation/désactivation persiste à la fermeture du document. Sinon tu peux utiliser à nouveau UserData pour stocker ta variable booléenne. Attention sur 2016, tu as des onglets qui ne sont pas des documents (page d'accueil) et dans ce cas le document passé dans l'argument du gestionnaire d'événement est null.
  25. Tu peux peut-être les stocker dans un dictionnaire où la clé serait le maintien (handle) de la polyligne support et la valeur serait une liste générique de polylignes. Le dictionnaire serait lui stocké dans Document.UserData. Comme ça tu génères/mets à jour les polylignes dans le WorldDraw et tu peux les réutiliser dans ton GetSnapPoints. Par contre tu dois placer un gestionnaire sur l’événement DocumentToBeDestroyed pour disposer toutes tes polylignes à la fermeture du document. Comme ce sont des données temporaires, ce n'est pas adapté de les stocker dans les dictionnaires d'extension.
×
×
  • 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é