CadFrank
Membres-
Compteur de contenus
141 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par CadFrank
-
Finalement, j'avais pas a toucher au Field. AttReference.TextString = NewString + AttReference.TextString Sa marche sans défaire mon field... Merci quand meme.
-
Oui un Field est un champ, dsl mon AutoCAD est en anglais Mon block
-
Je ne suis pas capable d'y ajouter mon block malheureusement.
-
Bonjour, J'essai de changer la valeur text d'un attribut qui contient un Field. Par contre, quand ma commande terminer j'obtien un field "####" public class Class { private const string BLOCKNAME = "SOL PL"; private const string TAG_COUNT = "LONG"; private const string TAG_SPACING = "ESPACEMENT"; private const string PREFIX = "%<\\AcObjProp Object(%<\\_ObjId "; private const string SUFFIX = ">%).Parameter(39).lookupString>%"; private string id; //private string textString; private int joistCount; private int spacing; enum DrawingUnit { Imperial, Metrique } [CommandMethod("CS", CommandFlags.UsePickSet)] public void CalculSolives() { Document document = Active.Document; Database database = Active.Database; Editor editor = Active.Editor; PromptSelectionResult psResults = editor.SelectImplied(); if (psResults.Status == PromptStatus.Error) { // Adds options to the Results. PromptSelectionOptions psOptions = new PromptSelectionOptions(); psOptions.MessageForAdding = "\nSélectionner les solives à calculer : "; // this captures the prompt values of the selected object psResults = editor.GetSelection(psOptions); } if (psResults.Status == PromptStatus.OK) { PromptDoubleResult pdResult = editor.GetDistance("Pour la distance utilisé par la/les solive(s). Choisir deux point. :"); double distance = pdResult.Value; using (var transaction = database.TransactionManager.StartTransaction()) { ObjectId[] objIDs = psResults.Value.GetObjectIds(); foreach (ObjectId objID in objIDs) { RXClass attClass = RXClass.GetClass(typeof(BlockReference)); if (objID.ObjectClass.IsDerivedFrom(attClass)) { BlockReference blockReference = transaction.GetObject(objID, OpenMode.ForRead) as BlockReference; AttributeCollection attCollection = blockReference.AttributeCollection; foreach (ObjectId attId in attCollection) { AttributeReference attReference = transaction.GetObject(attId, OpenMode.ForRead) as AttributeReference; if (attReference.Tag == TAG_SPACING) { spacing = getSpacing(attReference); } if (attReference.Tag == TAG_COUNT || attReference.HasFields == true) { ObjectId fieldId = attReference.GetField(); attReference.UpgradeOpen(); id = fieldId.ToString(); id = id.TrimStart('('); id = id.TrimEnd(')'); joistCount = CalculerSolives(spacing, distance); string newString = {:content:}quot;({joistCount}) P.ALU {PREFIX}{id}{SUFFIX}"; attReference.TextString = newString; } } } } transaction.Commit(); editor.Regen(); } } } private int getSpacing(AttributeReference attReference) { int spacing = 0; string textString = attReference.TextString; int index = textString.IndexOf('"'); textString = textString.Substring(2, index - 2); textString = @textString.Trim('"', 'c', '/'); try { spacing = Convert.ToInt32(textString); } catch (Exception) { Active.WriteMessage("Couldn't convert to int..."); } if (CheckDrawingUnit() == DrawingUnit.Metrique) { switch (spacing) { case 8: spacing = 200; break; case 10: spacing = 250; break; case 12: spacing = 300; break; case 16: spacing = 400; break; case 19: spacing = 490; break; } } return spacing; } private DrawingUnit CheckDrawingUnit() { if (Application.GetSystemVariable("DIMLUNIT").Equals(4)) { return DrawingUnit.Imperial; } else { return DrawingUnit.Metrique; } } public int CalculerSolives(int espacement, double distance) { double nombreSolives = distance / espacement; Math.Round(nombreSolives, 0, MidpointRounding.ToEven); return Convert.ToInt32(nombreSolives); } public Field getField(Transaction tr, AttributeReference attReference) { if (attReference.HasFields) { Field field = Active.Database.TransactionManager.GetObject(attReference.GetField(), OpenMode.ForRead) as Field; return field; } return null; } } public static class Active { /// <summary> /// Returns the active Editor object. /// </summary> public static Document Document => Application.DocumentManager.MdiActiveDocument; /// <summary> /// Returns the active Database object. /// </summary> public static Database Database => Document.Database; /// <summary> /// Returns the active Editor object. /// </summary> public static Editor Editor => Document.Editor; /// <summary> /// Sends a string to the command line in the active Editor /// </summary> /// <param name="message">The message to send.</param> public static void WriteMessage(string message) => Editor.WriteMessage(message); /// <summary> /// Sends a string to the command line in the active Editor using String.Format. /// </summary> /// <param name="message">The message containing format specifications.</param> /// <param name="parameter">The variables to substitute into the format string.</param> public static void WriteMessage(string message, params object[] parameter) => Editor.WriteMessage(message, parameter); }
-
Ouvrir AutoCAD avec WPF
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Merci encore de ton aide. Toujours apprécié -
Ouvrir AutoCAD avec WPF
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
je vien de trouver une de tes anciennes discussion et avec elle AutoCAD ouvre. Discussion -
Bonjour, J'utilise Autocad 2018 et j'essaie de l'ouvrir avec une fenêtre WPF mais cela ne fonctionne pas. J'ai fais mes recherche et il y a des trucs qui ne marche pas Recherche Voici le code [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000016-0000-0000-C000-000000000046")] public interface IMessageFilter { [PreserveSig] int HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo); [PreserveSig] int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType); [PreserveSig] int MessagePending( IntPtr hTaskCallee, int dwTickCount, int dwPendingType); } /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window, IMessageFilter { [DllImport("ole32.dll")] static extern int CoRegisterMessageFilter(IMessageFilter lpMessageFilter, out IMessageFilter lplpMessageFilter); public MainWindow() { InitializeComponent(); IMessageFilter oldFilter; CoRegisterMessageFilter(this, out oldFilter); } private void btnCreer_Click(object sender, RoutedEventArgs e) { const string productid = "autocad.application.22"; AcadApplication acApp = null; try { acApp = (AcadApplication)Marshal.GetActiveObject(productid); } catch { try { Type acType = Type.GetTypeFromProgID(productid); acApp = (AcadApplication)Activator.CreateInstance(acType, true); } catch { MessageBox.Show("cannot create object of type \"" + productid + "\""); } } if (acApp != null) { acApp.Visible = true; } } #region IMessageFilter Members int IMessageFilter.HandleInComingCall( int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo ) { return 0; // SERVERCALL_ISHANDLED } int IMessageFilter.RetryRejectedCall( IntPtr hTaskCallee, int dwTickCount, int dwRejectType ) { return 1000; // Retry in a second } int IMessageFilter.MessagePending( IntPtr hTaskCallee, int dwTickCount, int dwPendingType ) { return 1; // PENDINGMSG_WAITNOPROCESS } #endregion } est ce que qu'elle qu'un aurait une solution? Merci,
-
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Finalement, j'ai réussi le faire fonctionner pour un block qui n'est pas dynamic. Merci beaucoup de ton aide précieux. Cordialement. -
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Je ne sais pas si cela serait possible pour toi de faire une conférence sur HangOuts si cela te convient. P-e que cela m'aiderais a comprendre. On pourrait ce schéduler une date quand tu est disponible. -
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
J'obtiens toujours un erreur fatal. Pourquoi? using (Transaction transaction = Active.Database.TransactionManager.StartTransaction()) { DBDictionary layoutIds = transaction.GetObject(Active.Database.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary; int count = 0; foreach (DBDictionaryEntry entry in layoutIds) { ObjectIdCollection ids = new ObjectIdCollection(); Layout layout = transaction.GetObject(entry.Value, OpenMode.ForRead) as Layout; BlockTableRecord btr = transaction.GetObject(layout.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord; if (btr.Name != "*Model_Space") { foreach (ObjectId id in btr) { BlockReference br = transaction.GetObject(id, OpenMode.ForRead) as BlockReference; Active.WriteMessage("\n" + br.BlockName); Active.WriteMessage("\n" + br.Name); } } } count++; transaction.Commit(); } Sa fait mal a tete :( Si je le met dans un try c'a me sort "Object reference not set to an instance of an object". -
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Une autre chose qui me tracasse est quand je débug je ne sais pas quoi regarder. :( -
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Active est une class appart. public static class Active { /// <summary> /// Returns the active Editor object. /// </summary> public static Document Document { get { return Application.DocumentManager.MdiActiveDocument; } } /// <summary> /// Returns the active Database object. /// </summary> public static Database Database { get { return Document.Database; } } /// <summary> /// Returns the active Editor object. /// </summary> public static Editor Editor { get { return Document.Editor; } } /// <summary> /// Sends a string to the command line in the active Editor /// </summary> /// <param name="message">The message to send.</param> public static void WriteMessage(string message) { Editor.WriteMessage(message); } /// <summary> /// Sends a string to the command line in the active Editor using String.Format. /// </summary> /// <param name="message">The message containing format specifications.</param> /// <param name="parameter">The variables to substitute into the format string.</param> public static void WriteMessage(string message, params object[] parameter) { Editor.WriteMessage(message, parameter); } } using (Transaction transaction = Active.Database.TransactionManager.StartTransaction()) { DBDictionary layoutIds = transaction.GetObject(Active.Database.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary; foreach (DBDictionaryEntry entry in layoutIds) { ObjectIdCollection ids = new ObjectIdCollection(); Layout layout = transaction.GetObject(entry.Value, OpenMode.ForRead) as Layout; // Code. transaction.Commit(); } Est ce que c'est cela tu veux dire par parcourir les Layout avec ACAD_LAYOUT? -
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Désolé pour le code. Je sais que quelque chose manque dans ma compréhension. Désolé si je ne saisit pas tout en ce moment. Si tu as des références que je peux lire pour m'aider ça serait grandement apprécier. Cordialement, -
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
[CommandMethod("Test")] public static void Test() { var database = Active.Database; using (Transaction transaction = Active.Database.TransactionManager.StartTransaction()) { DBDictionary layoutIds = transaction.GetObject(Active.Database.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary; int count = 0; //int layoutCount = layoutIds.Count - 1; foreach (DBDictionaryEntry entry in layoutIds) { using (Transaction transLayout = Active.Database.TransactionManager.StartTransaction()) { ObjectIdCollection ids = new ObjectIdCollection(); BlockTable blockTable = transLayout.GetObject(database.BlockTableId, OpenMode.ForRead) as BlockTable; Layout layout = transLayout.GetObject(entry.Value, OpenMode.ForRead) as Layout; BlockTableRecord btr = blockTable["CARTOUCHE LU"].GetObject(OpenMode.ForRead) as BlockTableRecord; foreach (ObjectId brId in btr.GetBlockReferenceIds(true, true)) { if (!ids.Contains(brId)) { ids.Add(brId); } } // si le bloc est dynamique on cherche aussi les reférence des blocks anonymes if (btr.IsDynamicBlock) { foreach (ObjectId btrId in btr.GetAnonymousBlockIds()) { var anonymousBtr = (BlockTableRecord)transLayout.GetObject(btrId, OpenMode.ForRead); foreach (ObjectId brId in anonymousBtr.GetBlockReferenceIds(true, true)) { if (!ids.Contains(brId)) { ids.Add(brId); } } } } setTextString(transLayout, ids, "PAGE", count.ToString()); setTextString(transLayout, ids, "#PAGE", (layoutIds.Count - 1).ToString()); transLayout.Commit(); } count++; } transaction.Commit(); } } Bon voici le code que j'ai généré avec ton aide Gile. Par contre, en ce moment il affect que les dernier valeur retenu. Voici le dwg avec le bloc. Si tu as besoin de tester. Je veux que le nombre de page soit en fonction du layout. En ce qui concerne du reste, il reste identique. J'aimerai que des explications et nom le code pour le faire si possible. -
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Alors si je veux identifier un bloc sur un espace papier. Avec quel élément est-ce que je peux identifier le layout id? J'essaie vraiment de comprend comment leur API fonctionne :S -
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Donc, si je comprend bien, BlockTable contient tout les blocs auquel je peux insérer dans mon dessin, avec la command Insert? BlockTableRecord associe l'espace papier ou se situe le block et BlockReference est tout ce que le bloc contient incluant les attributs? -
Modifier les valeurs des attributs d'un block qui est situé dans une feuille
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Bonjour Gilles, Merci beaucoup pour ton aide. Désolé pour la réponse tardive j'avais mis un suivi pour mon sujet par contre, le courriel n'était pas bon. Je vais tester le code sous peu. Et te revenir avec des question surment :D -
Bonjour, Je cherche a modifier un block qui contient des attributs. Et je n'y parvient pas. Je sais que je suis dans le bloc mais la valeur ne change pas. [CommandMethod("ListBlockAtts")] public static void ListBlockAtts() { // Get the current document and start the Transaction Manager Document acDoc = Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // This example returns the block table for the current database BlockTable acBlkTble; acBlkTble = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; foreach (ObjectId objId in acBlkTble) { BlockTableRecord btr; btr = acTrans.GetObject(objId, OpenMode.ForRead) as BlockTableRecord; if (btr.HasAttributeDefinitions && btr.Name.Equals("CARTOUCHE LU")) { foreach (ObjectId bObjId in btr) { DBObject dbObj = bObjId.GetObject(OpenMode.ForRead); AttributeDefinition AttDef = dbObj as AttributeDefinition; if (AttDef != null) { if (AttDef.Tag == "TITRE") { btr.UpgradeOpen(); dbObj.UpgradeOpen(); AttDef.UpgradeOpen(); AttDef.TextString = "Something"; } } } } } acTrans.Commit(); } } Est-ce que quelqu'un pourrait m'aider svp François.
-
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Malheuresement, je ne suis pas sur si Lisp fonctionne avec excel ou une base de donnée. -
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Parfait aucun problème, je vais expliquer d'avantage. L'emploi ou je travail en ce moment nous utilisons beaucoup de block dynamic.Nous devons souvent faire une liste de matériel à l'aide de ces block. Alors je vexu faire une application qui sortira la liste de matériel sur une feuille excel. Voila ce qui en est. Par contre, j'essaie de comprend la documentation du guide de développement d'autocad et l'information n'est que publié en anglais. Cela m'incomode un peu car ma langue premier est le français et je crois ne pas toujours bien saisr ce qu'elle dit en anglais. Je trouve aussi qu'il manque beaucoup d'information sur la manipulation des blocs :D Mais bon c'est mon opinion. Si il y aurait de la documentation en francais cela maiderais surment plus. Cordialement Francois, -
Sélectionner des blocks et retirer le nom du block
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Ah bien sur. Dans un sens je veux comprendre la documentation d'autoCAD. Comprend la difference entre BlockTable, BlocktableRecord et BlockReference. pour comprend comment m'enligner avec mon code. Voila j'espère que c'est plus claire. J'ai ce bout code que j'ai ecrit : private List<string> GetBlockNames(Database database, SelectionSet selectionSet) { List<string> blockList = new List<string>(); try { using (Transaction transaction = database.TransactionManager.StartTransaction()) { var blockTable = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead); foreach (ObjectId selectedObject in selectionSet.GetObjectIds()) { var blockTR = (BlockReference)transaction.GetObject(selectedObject, OpenMode.ForRead); if (blockTR.IsDynamicBlock == true) { if (!blockList.Contains(blockTR.Name)) { blockList.Add(blockTR.Name); } } } } } catch (System.Exception ex) { Active.WriteMessage(ex.Message); } return blockList; } -
Sélectionner des blocks et retirer le nom du block
CadFrank a posté un sujet dans ObjectARX/DBX, C++, .NET, RealDWG
Bonjour, Je tente de retirer le nom de plusieur block sélection dans mon model. Est ce quelqu'un pourrais m'expliquer comment l'extraction d'information des objet fonction dans AutoCAD svp Merci, -
Block Dynamic - compteur selon visibilité
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
Par contre si on voudrais faire une liste de toute les blocks dans un dessin CAD il me faudrais mettre le meme nom d'état de visibilité. Pour être sur que seulement c'est block son choisi. Je vais donc devoir repenser a comment je fais mes blocks pour m'assurer que je choisi le paramettre voulu. Merci encore -
Block Dynamic - compteur selon visibilité
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
J'ai testé ton code. J'ai une petite question, Est ce que l'état de visibilité correspond a des lookup? Car j'ai toujours plus qu'un élément qui sort dans la ligne de command. J'aimerais avoir si possible l'information relative au class .net d'autoCAD? svp ou bien m'indiquer ou je peux la trouver. Désolé si j'ai du délai sur mes questions j'habitte au Québec :D Merci. -
Block Dynamic - compteur selon visibilité
CadFrank a répondu à un(e) sujet de CadFrank dans ObjectARX/DBX, C++, .NET, RealDWG
ReBonjour, Donc en ce moment, il n'y a rien comme méthode qui détermine que la propriété est la visibilité? Par contre, en AutoLisp cela est possible.. Bon bien je crois que je vais ddevoir faire avec. Merci beaucoup de ton aide.
