Тема: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями

Собственно все в теме.
Кто-нибудь сталкивался с такой проблемой?

Re: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями

Проблема то в чем?

Re: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями

Есть много замкнутых полилиний, необходимо найти все общие площади (площади фигуры полученной пересечение замкнутых контуров).
Пока двигаюсь в направлении PlaneSurface.
По полилинии получаю Region, потом PlaneSurface, потом ищу их пересечения штатными средствами Autocad (это пока в работе), потом "ломаю его" получаю область и извлекаю площадь.
Пока так.
Может есть прощу варианты?

Re: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями

Из замкнутых полилиний получаешь Region'ы, зачем находишь их пересечение (тоже Region'ы) и находишь их площадь. Не понял причем здесь PlaneSurface.

(изменено: Judas, 2 октября 2017г. 18:29:06)

Re: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями

PlaneSurface - исключил. (понял, что перебор. Спасибо).
Пересечение Region метод не подскажет. (Заранее спасибо).
BooleanOperation??

Re: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями

Александр благодарю Вас.
Получилось.
Теперь буду думать про второй шаг.
ОГРОМНОЕ СПАСИБО!!! (region и BooleanOperation)

(изменено: Александр Ривилис, 2 октября 2017г. 20:07:53)

Re: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями

Judas пишет:

Теперь буду думать про второй шаг.

Что за второй шаг?
По-прежнему настоятельно рекомендую задавать вопросы здесь:
http://adn-cis.org/forum/index.php?board=4.0
Все вопросы, на которые не находятся ответы силами сообщества, передаются в Autodesk (ADN DevHelp).

Re: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями

День добрый всем!

   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 уровня. но не могу понять почему возникает ошибка преобразования типа?

Может кто подскажет, заранее спасибо.

Re: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями

BlockReference и BlockTableRecord - это совершенно разные объекты. Первый - это вставка блока (INSERT), второй - описание блока (BLOCK)
Всё остальное обсуждение - по ссылке, которую я давал выше неоднократно.

Re: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями

Александр! В очередной раз благодарю.
Опять все также не внимательность. Пора заканчивать ночные разработки.
Остальное обсуждение переношу по адресу который вы написали. Регюсь!

Re: Поиск площади фигуры, полученной путем пересечению двух областей, определенных полилиниями

Помогите пожалуйста
Воздуховоды от подрядчика прокси
Аксонометрия на печать выходит закрашенная
получается мазня-ничего не видно
Хотя их пдф - отлично все - только контуры
что делать?