Тема: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями
Собственно все в теме.
Кто-нибудь сталкивался с такой проблемой?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → .NET → Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Собственно все в теме.
Кто-нибудь сталкивался с такой проблемой?
Проблема то в чем?
Есть много замкнутых полилиний, необходимо найти все общие площади (площади фигуры полученной пересечение замкнутых контуров).
Пока двигаюсь в направлении PlaneSurface.
По полилинии получаю Region, потом PlaneSurface, потом ищу их пересечения штатными средствами Autocad (это пока в работе), потом "ломаю его" получаю область и извлекаю площадь.
Пока так.
Может есть прощу варианты?
Из замкнутых полилиний получаешь Region'ы, зачем находишь их пересечение (тоже Region'ы) и находишь их площадь. Не понял причем здесь PlaneSurface.
PlaneSurface - исключил. (понял, что перебор. Спасибо).
Пересечение Region метод не подскажет. (Заранее спасибо).
BooleanOperation??
Александр благодарю Вас.
Получилось.
Теперь буду думать про второй шаг.
ОГРОМНОЕ СПАСИБО!!! (region и BooleanOperation)
Теперь буду думать про второй шаг.
Что за второй шаг?
По-прежнему настоятельно рекомендую задавать вопросы здесь:
http://adn-cis.org/forum/index.php?board=4.0
Все вопросы, на которые не находятся ответы силами сообщества, передаются в Autodesk (ADN DevHelp).
День добрый всем!
public class CrossRegion { #region Поля класса - базовые //00-Id блока private ObjectId id; //00-имя блока private string nameId; //00-Тип региона private string idType; //00-Классификатор private string classType; public CrossRegion() { id = ObjectId.Null; idType = EmptyString; classType = EmptyString; } #region Доступ к полям - базовые //00-Id блока public ObjectId Id { get { return id; } set { id = value; } } ///00-имя блока public string NameId { get { return nameId; } set { nameId = value; } } //00-Тип региона public string IdType { get { return idType; } set { idType = value; } } //00-Тип региона public string ClassType { get { return classType; } set { classType = value; } } } static List<CrossRegion> ListCrossReport() { //экземпляр класса доступа к чертежу AccessToDocument AcToDraw = new AccessToDocument(); //Получаем ссылку на документ Document AcadDoc = AcToDraw.Doc; // получаем ссылку на БД Database AcadDB = AcToDraw.DBase; // получаем ссылку на редактор Editor AcadEd = AcToDraw.Ed; //выбор всех вхождений TypedValue[] filterlist = new TypedValue[1]; filterlist.SetValue(new TypedValue(0, "INSERT"), 0); SelectionFilter filter = new SelectionFilter(filterlist); PromptSelectionResult acSSPrompt = AcadEd.SelectAll(filter); SelectionSet acSSet = acSSPrompt.Value; //Список регионов исследования List<CrossRegion> CrossRegionReport = new List<CrossRegion>(); if (acSSPrompt.Status == PromptStatus.OK) { using (Transaction tr = AcadDB.TransactionManager.StartTransaction()) { foreach (SelectedObject selobj in acSSet) { BlockTable blockTable = (BlockTable)tr.GetObject(AcadDB.BlockTableId, OpenMode.ForRead); BlockReference LocalBlockRefSign = (BlockReference)tr.GetObject(selobj.ObjectId, OpenMode.ForRead); BlockTableRecord LocalBlockRef = blockTable[LocalBlockRefSign.Name].GetObject(OpenMode.ForRead) as BlockTableRecord; bool bAttDef = LocalBlockRef.HasAttributeDefinitions; if (bAttDef) { Autodesk.AutoCAD.DatabaseServices.AttributeCollection AtrCol = LocalBlockRefSign.AttributeCollection; //Базовые значения для знака ПК string LocalKadastrNumber = (AtrCol[0].GetObject(OpenMode.ForWrite) as AttributeReference).TextString; //Базовые значения для знака Основание string LocalBase = (AtrCol[1].GetObject(OpenMode.ForWrite) as AttributeReference).TextString; //Базовые значения для знака размещение CrossRegionReport.Add(new CrossRegion() { Id = LocalBlockRef.Id, //00-Id блока NameId = LocalBlockRef.Name, //00-имя блока IdType = Convert.ToString(i), //00-Тип региона ClassType = Convert.ToString(3), //00-Классификатор }); } } tr.Commit(); } } else { MessageBox.Show("Нет характерных блоков"); } return CrossRegionReport; } [CommandMethod("ExplodingABlock")] public void ExplodingABlock() { //экземпляр класса доступа к чертежу AccessToDocument AcToDraw = new AccessToDocument(); //Получаем ссылкe на документ Document AcadDoc = AcToDraw.Doc; // получаем ссылкe на БД Database AcadDB = AcToDraw.DBase; List<CrossRegion> Report = ListCrossReport(); using (Transaction tr = AcadDB.TransactionManager.StartTransaction()) { foreach (CrossRegion crossRegion in Report) { var br = (BlockReference)tr.GetObject(crossRegion.Id, OpenMode.ForRead); //BlockReference LocalBlockRefSign = (BlockReference)tr.GetObject(crossRegion.Id, OpenMode.ForRead) as BlockReference; MessageBox.Show(br.Name, "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning);
А теперь суть вопроса:
Есть класс объектов CrossRegion который заполняется данными из блоков в автокаде.
После заполнения имеем список ListCrossReport(), в котором в том числе и храниться Id элемента чертежа автокада. (точнее блока).
Потом я хочу в другом метода вызвать нужные мне блоки и разломать из и потренироваться с ними, но выкидывает ошибку:
************** Текст исключения **************
System.InvalidCastException: Не удалось привести тип объекта "Autodesk.AutoCAD.DatabaseServices.BlockTableRecord" к типу "Autodesk.AutoCAD.DatabaseServices.BlockReference".
в AreaEarth.FindCrossPoint.ExplodingABlock() в D:\Csharp\Programm\006-AreaEarth\AreaEarth\AreaEarth.cs:строка 595
в Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
в Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
в Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)
в Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()
Я не мастер 80 уровня. но не могу понять почему возникает ошибка преобразования типа?
Может кто подскажет, заранее спасибо.
BlockReference и BlockTableRecord - это совершенно разные объекты. Первый - это вставка блока (INSERT), второй - описание блока (BLOCK)
Всё остальное обсуждение - по ссылке, которую я давал выше неоднократно.
Александр! В очередной раз благодарю.
Опять все также не внимательность. Пора заканчивать ночные разработки.
Остальное обсуждение переношу по адресу который вы написали. Регюсь!
Помогите пожалуйста
Воздуховоды от подрядчика прокси
Аксонометрия на печать выходит закрашенная
получается мазня-ничего не видно
Хотя их пдф - отлично все - только контуры
что делать?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форум работает на PunBB, при поддержке Informer Technologies, Inc