Giropode Posté(e) le 5 novembre 2015 Posté(e) le 5 novembre 2015 Bonjour à tous, Nouvelle question sur Revit. J'ai l'impression d'être un psychopathe de la mise en forme, car je n'ai trouvé aucun sujet parlant de ce problème. Existe-t-il un moyen pour aligner un texte/libellé par rapport à un point de justification ? Par exemple le milieu-centre d'une zone de texte par rapport au centre d'une "case" ? Pour l'instant je fais de la mise en place à l’œil, mais mon côté psychorigide est excessivement agacé par cette mise en forme approximative ! Du coup, si vous avez l'astuce je suis tout ouïe ! Bonne journée à tous ! Mon pense bête : Mon blog fourre-toutMa bible : Aide AutoCADMon futur calvaire : Revit
Maxence DELANNOY Posté(e) le 5 novembre 2015 Posté(e) le 5 novembre 2015 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. Maxence DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
Giropode Posté(e) le 5 novembre 2015 Auteur Posté(e) le 5 novembre 2015 Bonjour, Merci de la réponse. Je m'en doutais que cette fonction de confort n'était pas implémentée directement. Aaaah les ricains ! Sinon, je pense avoir a peu près bien suivi l'article du premier numéro d'AroBIM:Création d'un module C#Création d'une MacroCollage du code que tu m'as donnéCompilation... Ah... j'ai un souci au point 5 Le compilateur me mets deux erreur:Le nom 'commandData' n'existe pas dans le contexte actuel (CS0103)Le type ou le nom d'espace de noms 'UserException' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?) (CS0246) As-tu une piste ? Merci par avance de ta précieuse aide ! Mon pense bête : Mon blog fourre-toutMa bible : Aide AutoCADMon futur calvaire : Revit
Goldorak44 Posté(e) le 5 novembre 2015 Posté(e) le 5 novembre 2015 Salut, commandData est utilisé lorsque tu développe un addin avec un logiciel externe à Revit (exemple :Visual Studio). Dans le cas présent la ligne est :UIDocument uiDoc = Application.ActiveUIDocument; Pour l'Exception, je pense que UserException est une classe que Maxence à créé dans son projet. Dans ton cas, utilise ceci :throw new Exception("Transaction can not be started."); ;) 1 PIRO CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
Maxence DELANNOY Posté(e) le 6 novembre 2015 Posté(e) le 6 novembre 2015 Je n'ai rien de plus à ajouter... C'est parfait. Merci @Goldorak44. Maxence DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
sbosarl Posté(e) le 7 novembre 2015 Posté(e) le 7 novembre 2015 bonjour,Les premiers pas dans le monde sont les plus dur, faire une boite de dialogue "hello coucou " la je sais faire. Applique le code texte entre 2pt avec les 2 modifications UIDocument uiDoc = 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 Exception("Transaction can not be started."); } }Reponse constructeur :'Autodesk.Revit.ApplicationServices.Application' ne contient pas une définition pour 'ActiveUIDocument' et aucune méthode d'extension 'ActiveUIDocument' acceptant un premier argument de type 'Autodesk.Revit.ApplicationServices.Application' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?) Construction échouée. (00:00:00.5829237)J'ai installer SDK .msi , j'ai un beau répertoire avec aucun lien vers APIJ'ai du mal faire un truc ,
Goldorak44 Posté(e) le 7 novembre 2015 Posté(e) le 7 novembre 2015 Salut, dans quel environnement exécute tu ton ton code ?Dans le dossier SDK, toutes les solutions sont ouvrables avec Visual Studio. Que te manque t-il dans ce dossier ? PIRO CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
sbosarl Posté(e) le 8 novembre 2015 Posté(e) le 8 novembre 2015 bonjour, je n'est pas installé visuel studio pour l'instantrevit mep 2016 sous windows 10 (aucune autre machine actuellement sous la mains)à cette heure je vient de trouvé AddInManager N EST PAS CONPATIBLE WINDOWS 10Merci pour les infos ,je vait faire mes recherches pour bien demmarer ou attente les MàJ éditer à 10h46 après modification des fichiers *.addin changerment des textes "[TARGETDIR]" par " ./" j'ai bien le bouton outil externe
Giropode Posté(e) le 12 novembre 2015 Auteur Posté(e) le 12 novembre 2015 Bonjour à tous, Désolé de ne pas avoir donné signe de vie, j'étais en congé :(rires forts): . J'ai donc appliqué les petites modifications préconisées par @Goldorak44. Cependant, j'ai toujours une erreur qui s'affiche dans le compilateur :'Autodesk.Revit.ApplicationServices.Application' ne contient pas une définition pour 'ActiveUIDocument' et aucune méthode d'extension 'ActiveUIDocument' acceptant un premier argument de type 'Autodesk.Revit.ApplicationServices.Application' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?) (CS1061) Voici le code tel que je l'ai dans mon éditeur (peut être que j'ai fait une boulette !): /* * Created by SharpDevelop. * User: GuillaumeO * Date: 05/11/2015 * Time: 18:28 * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using Autodesk.Revit.Exceptions; using Autodesk.Revit.UI; using Autodesk.Revit.DB; using Autodesk.Revit.UI.Selection; using System.Collections.Generic; using System.Linq; namespace ModuleBetrec { [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] [Autodesk.Revit.DB.Macros.AddInId("735454FC-813B-42BB-9E79-7D6569BC811C")] public partial class ThisApplication { private void Module_Startup(object sender, EventArgs e) { } private void Module_Shutdown(object sender, EventArgs e) { } #region Revit Macros generated code private void InternalStartup() { this.Startup += new System.EventHandler(Module_Startup); this.Shutdown += new System.EventHandler(Module_Shutdown); } #endregion public void CenterTxt() { UIDocument uiDoc = Application.ActiveUIDocument; Document doc = uiDoc.Document; Selection selection = uiDoc.Selection; ICollection<ElementId> ids = selection.GetElementIds(); using (var tr = new Transaction(doc, "CenterTxt")) { 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 Exception("Transaction can not be started."); } } } } } Merci à tous et bonne journée ! Mon pense bête : Mon blog fourre-toutMa bible : Aide AutoCADMon futur calvaire : Revit
Goldorak44 Posté(e) le 12 novembre 2015 Posté(e) le 12 novembre 2015 Salut, effectivement, il y a une erreur !! Dans le gestionnaire de Macro, tu as créé ton module dans l'onglet "Application" au lieu de l'onglet "NOM_DU_PROJET". Si tu souhaite que ta commande soit liée à ton ordinateur et non pas au document, tu dois développer ton module dans l'onglet "Application". Tu récupère le document courant comme ceci :UIDocument uiDoc = ActiveUIDocument; Par contre si tu souhaite que ta commande soit associée à ton document et non à ton ordinateur, tu dois développer ton module dans l'onglet "NOM_DU_PROJET". Dans ce cas là tu récupère le document courant comme ceci :UIDocument uiDoc = Application.ActiveUIDocument; ;) PIRO CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
Giropode Posté(e) le 17 novembre 2015 Auteur Posté(e) le 17 novembre 2015 Bonjour, C'est parfait, la compilation se déroule sans erreur. Maintenant, dernière question, liée à mon manque de connaissance, comment utilise-t-on dans un projet cette macro ? :(rires forts): Bonne journée à tous. Mon pense bête : Mon blog fourre-toutMa bible : Aide AutoCADMon futur calvaire : Revit
Goldorak44 Posté(e) le 17 novembre 2015 Posté(e) le 17 novembre 2015 :(rires forts): :(rires forts): 1) Tu sélectionne les textes que tu souhaite aligner2) Tu exécute la macro3) Pour chaque texte sélectionné, il va te demander deux points4) il va te déplacer chaque texte au milieu des deux points Essaye cette manip avec 1 texte puis plusieurs pour bien comprendre le fonctionnement !A partir de ça, à toi de modifier la macro à ta guise pour obtenir le fonctionnement souhaité. N'hésite pas a poser des questions si des points te bloque. ;) PIRO CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
Giropode Posté(e) le 19 novembre 2015 Auteur Posté(e) le 19 novembre 2015 Ahhh ! Cool ! C'est parfait ! Merci beaucoup ! Mon pense bête : Mon blog fourre-toutMa bible : Aide AutoCADMon futur calvaire : Revit
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant