Последние сообщения

Последние сообщения

Страницы: 1 ... 5 6 [7] 8 9 10
61
AutoCAD .NET API / Re: Множественное копирование
« Последний ответ от Judas 10-05-2024, 13:11:00 »
Получилось так
Код - C# [Выбрать]
  1. using (Teigha.DatabaseServices.Transaction tr = db.TransactionManager.StartTransaction())
  2. {
  3.     BlockTableRecord blocktableRecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  4.  
  5.     //Получаем полилинию (точки) для копирования
  6.     Polyline trassa = tr.GetObject(trassId, OpenMode.ForRead) as Polyline;
  7.     //Первая расчетная точка полилинии
  8.     Point3d startPoint = trassa.GetPoint3dAt(0);
  9.  
  10.     //Перебор всех точек, кроме 1-ой: считается что сечение стоит там
  11.     for (int i = 1; i <= (trassa.NumberOfVertices - 1); i++)
  12.     {
  13.         //Начальная и конечная точка отрезка на полилинии
  14.         Point3d insPoint = trassa.GetPoint3dAt(i);
  15.  
  16.         Polyline cross = tr.GetObject(crossId, OpenMode.ForRead) as Polyline;
  17.  
  18.         Polyline crossClone = cross.Clone() as Polyline;
  19.         //Перемещение копии
  20.         crossClone.TransformBy(Matrix3d.Displacement(insPoint - startPoint));
  21.  
  22.         blocktableRecord.AppendEntity(crossClone);
  23.         tr.AddNewlyCreatedDBObject(crossClone, true);
  24.  
  25.     }
  26.     tr.Commit();
  27. }
  28.  
  29.  
62
AutoCAD .NET API / Множественное копирование
« Последний ответ от Judas 10-05-2024, 10:31:08 »
День добрый всем.
В рамках решаемой задачи требуется обеспечит копирование объекта по точкам с полилинии.
Копирование выполняется, но только одного экземпляра и каждый раз расстояние от исходника до экземпляра растет за счет координаты.

Понимаю, что это одна и таже копия только смещается, не могу понять как сделать, что бы копия создавалась и смещалась, далее следующая копия от исходника и так далее.


Код - C# [Выбрать]
  1. [CommandMethod("GetPolyline", CommandFlags.UsePickSet)]
  2. public static void GetPolyline()
  3. {
  4.     //экземпляр класса доступа к чертежу
  5.     AccessToDocument accessToDocument = new ();
  6.     //Получаем ссылкe на документ
  7.     Document ad = accessToDocument.Doc;
  8.     // получаем ссылкe на БД
  9.     Database db = accessToDocument.DBase;
  10.  
  11.     #region Выбор сечения траншеи
  12.     //Переменная получаемая из командной строки
  13.     PromptEntityOptions EntityOption = new ("\n Выберите сечение траншеи");
  14.     //Запрос в командную строку на указание полилинии
  15.     EntityOption.SetRejectMessage("");
  16.     //проверка типа выбранного объекта
  17.     EntityOption.AddAllowedClass(typeof(Polyline), true);
  18.     //Запрос выбора объектов в области чертежа
  19.     PromptEntityResult EntityResult = ad.Editor.GetEntity(EntityOption);
  20.     //Id сечения
  21.     ObjectId crossId = ObjectId.Null;
  22.     //проверка статуса правильности выбора
  23.     if (EntityResult.Status == PromptStatus.OK)
  24.     {
  25.         crossId = EntityResult.ObjectId;
  26.     }
  27.     #endregion
  28.  
  29.     #region Линии дна траншеи
  30.     //Переменная получаемая из командной строки
  31.     EntityOption = new PromptEntityOptions("\n Выберите линию дна траншеи");
  32.     //Запрос в командную строку на указание полилинии
  33.     EntityOption.SetRejectMessage("");
  34.     //проверка типа выбранного объекта
  35.     EntityOption.AddAllowedClass(typeof(Polyline), true);
  36.     //Запрос выбора объектов в области чертежа
  37.     EntityResult = ad.Editor.GetEntity(EntityOption);
  38.     //Id линии дна
  39.     ObjectId trassId = ObjectId.Null;
  40.     //проверка статуса правильности выбора
  41.     if (EntityResult.Status == PromptStatus.OK)
  42.     {
  43.         trassId = EntityResult.ObjectId;
  44.     }
  45.     #endregion
  46.  
  47.     ObjectIdCollection collection = new() { crossId };
  48.     ObjectId ModelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(db);
  49.     IdMapping mapping = new();
  50.  
  51.  
  52.     using (Transaction tr = db.TransactionManager.StartTransaction())
  53.     {
  54.         BlockTableRecord blocktablerecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  55.  
  56.         //Получаем полилинию (точки) для копирования
  57.         Polyline polyTrassa = tr.GetObject(trassId, OpenMode.ForRead) as Polyline;
  58.         //Первая расчетная точка полилинии
  59.         Point3d startPoint = polyTrassa.GetPoint3dAt(0);
  60.        
  61.         //Перебор всех точек, кроме 1-ой: считается что сечение стоит там
  62.         for (int i = 0; i <= (polyTrassa.NumberOfVertices-1); i++)
  63.         {
  64.             /*
  65.             ObjectIdCollection collection = new() { crossId };
  66.             ObjectId ModelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(db);
  67.             IdMapping mapping = new();
  68.             */
  69.  
  70.             //Начальная и конечная точка отрезка на полилинии
  71.             Point3d insPoint = polyTrassa.GetPoint3dAt(i);
  72.  
  73.             db.DeepCloneObjects(collection, ModelSpaceId, mapping, false);
  74.             IdPair pair1 = mapping[crossId];
  75.  
  76.             //Открываем копию
  77.             Polyline cross = tr.GetObject(pair1.Value, OpenMode.ForWrite) as Polyline;
  78.  
  79.             //Перемещение копии
  80.             cross.TransformBy(Matrix3d.Displacement(insPoint - startPoint));
  81.         }
  82.         tr.Commit();
  83.     }
  84. }
  85.  
63
В общем что то не получается =(
Можно попробовать следующее.

не знаю как через API, но при разбивке MText через (_explode)
MText разбивается на строки DBText и вместо поля в DBText вставляется его значение.
Тут важно проверить, знаешь ли ты значение значение в MText "сломанного поля" до разбивки и что при разбивке такого поля происходит, сохраняется ли значение, не происходит ли смещения и т.д.

Если после разбивки на DBText значение поля не изменилось и не сместилось, можно попробовать следующее:
DBText дробится на несколько DBText, если в MText используются теги, например подчеркивание

Экспериментировал с тегом даты:
В MText было: "\A1;{\W1;\Lмая 7, 2024}"
В DbText стало: "%%Uмая 7, 2024"

Т.е. логика такая:
1. находишь значение сломанного поля, например "мая 7, 2024",
2. оборачиваешь поле в тег подчеркивания "\A1;{\W1;\Lмая 7, 2024}". (можно попробовать тег цвета, шрифта и т.д.)
3. Разбиваешь MText
4. Ищешь последние добавленные DbText с нужным значением поля "%%Uмая 7, 2024" или "мая 7, 2024"
5. Определяешь координаты

64
ObjectARX / Re: AС2013 + VS2010 + Win11 = ошибка .NET FW4.0
« Последний ответ от Привалов Дмитрий 06-05-2024, 08:10:54 »
Кто-нибудь знает решение?
1. погуглить
https://www.downloadsource.net/how-to-install-and-enable-missing-net-framework-2-0-3-5-4-5-on-windows-11/n/21043/

2. Как вариант, использовать виртуалку, например
https://www.virtualbox.org
65
AutoCAD .NET API / Re: Как найти координаты поля в тексте
« Последний ответ от Владимир Шу 05-05-2024, 12:56:46 »
я пробовал получать фрагменты MText через mtext.ExplodeFragments( new Db.MTextFragmentCallback(MTextCallback)); с сохранением во внешний список расположение фрагмента, его содержание и размер и с последующим поиском в полученных фрагментах значения поля (string value = field.GetStringValue();), но это так коряво и при наличие множества битых полей не надежно, да и положение получается не отдельного поля, а строки в MTextе

В общем что то не получается =(
66
AutoCAD .NET API / Re: Как найти координаты поля в тексте
« Последний ответ от avc 05-05-2024, 10:51:50 »
Серьезная задачка. Я бы попробовал создать новый MText со всем содержимым старого ДО начала кода поля и попытаться понять, где конец текста получился. И еще один MText чисто с кодом неработающего поля для расчета его размеров. Конечно куча проблем вылезет с оборвавшимся форматированием и многострочными текстами...
67
AutoCAD .NET API / Как найти координаты поля в тексте
« Последний ответ от Владимир Шу 05-05-2024, 10:39:30 »
При проверке файлов, нормоконтролер помечает (обводит) неправильные фрагменты, к таким фрагментам относятся, в том числе, и сломанные поля.
И если найти все поля в чертеже не проблема, найти сломанные поля, так же не сложно, найти внутри каких объектов находятся поля так же не сложно, то вот как найти координаты самих полей, вот тут у меня затык.
К сожалению координаты и границы объекта внутри которого находится сломанное поле не подходят, так как это может быть MText, с портянкой на 2-3 страницы.

Собственно вопрос в заголовке темы, как найти координаты поля или как найти координаты любой буквы в тексте

P.S.
Я порылся в методах и свойствах как самого класса Field, так и его родителя DBObject, но все что там могло мне помочь, это Bounds, но естественно эти поля не заполнены.

Код - C# [Выбрать]
  1.       App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
  2.       if (doc == null) { return; }
  3.  
  4.       Db.Database db = doc.Database;
  5.       Ed.Editor ed = doc.Editor;
  6.  
  7.  
  8.       var opt = new Ed.PromptEntityOptions("\nSelect an MText object containing field(s): ");
  9.       opt.SetRejectMessage("\nObject must be MText.");
  10.       opt.AddAllowedClass(typeof(Db.MText), false);
  11.  
  12.       Ed.PromptEntityResult res = ed.GetEntity(opt);
  13.  
  14.       if (res.Status != Ed.PromptStatus.OK) { return; }
  15.  
  16.  
  17.       using (Db.Transaction Tx = db.TransactionManager.StartTransaction())
  18.       {
  19.         var mtext = Tx.GetObject(res.ObjectId, Db.OpenMode.ForRead) as Db.MText;
  20.  
  21.         if (!mtext.HasFields)
  22.         {
  23.           ed.WriteMessage("\nObject does not contain fields.");
  24.           return;
  25.         }
  26.  
  27.         Db.ObjectId id = mtext.GetField();
  28.         Db.Field fieldBase = Tx.GetObject(id, Db.OpenMode.ForRead) as Db.Field;
  29.        
  30.         var fields = fieldBase.GetChildren();
  31.         foreach (var field in fields)
  32.         {
  33.           if (field.EvaluationStatus.Status != Db.FieldEvaluationStatus.Success)
  34.           {
  35.             if (field.Bounds != null)
  36.             {
  37.               //он всегда null
  38.               var pnt = field.Bounds.Value.MinPoint;
  39.             }
  40.  
  41.            
  42.             if(field.Drawable.Bounds != null)
  43.             {
  44.               // и этот всегда null
  45.             }
  46.  
  47.             ed.WriteMessage("\nЕсть проблемки!");
  48.  
  49.           }
  50.         }
  51.         Tx.Commit();
  52.       }
68
ObjectARX / AС2013 + VS2010 + Win11 = ошибка .NET FW4.0
« Последний ответ от pucher 05-05-2024, 10:24:25 »
Здравствуйте.
Установлен Windows 11. Для разработки приложения ObjectARX под Autocad2013 нужен VisualStudio2010. Новый проект в VisualStudio2010 создается нормально. При компиляции появляется сообщение "об отсутствии на компьютере .Net Framework 4.0". При попытке повторного открытия проекта появляется сообщение "об отсутствии на компьютере .Net Framework 4.0" и проект не открывается. В Windows 11 предустановлен .Net Framework 4.8, а VisualStudio2010, как я понимаю, умеет работать максимум с .Net Framework 4.0. Windows 11 не дает установить .Net Framework 4.0, т.к. "уже установлен более новый .Net Framework".
Кто-нибудь знает решение?
69
Свойства Normal у него нет.
О да, со сплайнами все сложно :) Есть плоские сплайны (IsPlanar == true), у них можно вызвать GetPlane. Вот там и нормаль.
И для меня важно, что по этой плоскости и ее нормали уже будет строиться Region (CreateFromCurves). Так как у одной штриховки петли-сплайны получаются с разными нормалями, то они между собой не склеиваются и не вычитаются и я построить полный регион с дырками и островками не могу. Ну то есть не мог. Уже выкрутился.
70
Логично было бы, чтоб зеркалился сплайн, как все остальные объекты. А он остается тот же самый даже если сдвинуть плоскость в сторону (просто перемещается). Для себя уже решил эту проблему - мне в любом случае нужны регионы. Преобразую в Region и он прекрасно зеркалит нормаль.
Вообще-то Spline - это 3D-объект (в отличии от Polyline и Region). Что ты понимаешь под его нормалью? Свойства Normal у него нет.
Страницы: 1 ... 5 6 [7] 8 9 10