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

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

Страницы: [1] 2 3 ... 10
1
AutoCAD .NET API / Re: Как найти координаты поля в тексте
« Последний ответ от avc 05-05-2024, 10:51:50 »
Серьезная задачка. Я бы попробовал создать новый MText со всем содержимым старого ДО начала кода поля и попытаться понять, где конец текста получился. И еще один MText чисто с кодом неработающего поля для расчета его размеров. Конечно куча проблем вылезет с оборвавшимся форматированием и многострочными текстами...
2
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.       }
3
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".
Кто-нибудь знает решение?
4
Свойства Normal у него нет.
О да, со сплайнами все сложно :) Есть плоские сплайны (IsPlanar == true), у них можно вызвать GetPlane. Вот там и нормаль.
И для меня важно, что по этой плоскости и ее нормали уже будет строиться Region (CreateFromCurves). Так как у одной штриховки петли-сплайны получаются с разными нормалями, то они между собой не склеиваются и не вычитаются и я построить полный регион с дырками и островками не могу. Ну то есть не мог. Уже выкрутился.
5
Логично было бы, чтоб зеркалился сплайн, как все остальные объекты. А он остается тот же самый даже если сдвинуть плоскость в сторону (просто перемещается). Для себя уже решил эту проблему - мне в любом случае нужны регионы. Преобразую в Region и он прекрасно зеркалит нормаль.
Вообще-то Spline - это 3D-объект (в отличии от Polyline и Region). Что ты понимаешь под его нормалью? Свойства Normal у него нет.
6
Логично было бы, чтоб зеркалился сплайн, как все остальные объекты. А он остается тот же самый даже если сдвинуть плоскость в сторону (просто перемещается). Для себя уже решил эту проблему - мне в любом случае нужны регионы. Преобразую в Region и он прекрасно зеркалит нормаль.
7
Трансформация Mirroring через plane почему-то не меняет нормаль. Хотя должна бы...
Думаешь должна? Если этот сплайн находится в этой плоскости, то отзеркаливание ничего не делает. Из спортивного интереса можешь попробовать метод ReverseCurve.
8
Указанный код работает только в плоскости XY. Требуется назначить нормаль для линии и полилинии, а полилинию еще сдвинуть на plane.PointOnPlane.
У сплайнов направление нормали может получиться противоположным к plane.Normal. Как исправить - я пока не придумал. Трансформация Mirroring через plane почему-то не меняет нормаль. Хотя должна бы...
9
Если переименовать деталь, когда сборка открыта, то тогда её заменить не выйдет, а если переименовать деталь подсборки, до открытия основной сборки, то тогда при открытии основной сборки не получится программно обойти эту подсборку ...
Вы смешиваете два процесса!
В цикле обхода дерева Вы получаете путь к подсборке! Если эта подсборка требует замены, то вы сохраняете ее по новому адресу! При этом в ней остаются старые ссылки. Нужно по условию вызвать саб(функцию) - эта операция должна быть рекурсивна ко всем элементам, входящим в эту подсборку(т.е. к деталям и другим подсборкам), который выполнит сохранение и замену имен в этой подсборке к входящим элементам. Если не требует - переходим к следующему элементу цикла
10
Обход подсборок выполняется через вызов подпрограммы, по условию.
Вот пример подобного цикла, думаю разберешься.  ;)
https://adn-cis.org/forum/index.php?topic=9999.msg44879#msg44879

Спасибо, помогли в обходе подсборок)
Переименовывание только не вышло
Если переименовать деталь, когда сборка открыта, то тогда её заменить не выйдет, а если переименовать деталь подсборки, до открытия основной сборки, то тогда при открытии основной сборки не получится программно обойти эту подсборку ... 
Страницы: [1] 2 3 ... 10