Перейти к содержанию
azaytsev

MultiCAD.NET: подсчет суммарной длины отрезков на чертеже

Рекомендуемые сообщения

http://habrahabr.ru/company/nanosoft/blog/246511/

6863797343d547c9832314d6d8c4b90f.jpg

 

К нам в техподдержку часто приходит вопрос: "Как посчитать суммы длин отрезков (участков трубопровода, элементов электрических схем и т.п.) в чертеже?". Существует масса способов решения этой задачи, в сегодняшней публикации мы рассмотрим реализацию приложения на MultiCAD.NET API, суммирующего длины, которое работает в nanoCAD, AutoCAD и ZWCAD. В качестве примера мы возьмем задачу определения суммарной длины труб в схеме водоснабжения и рассмотрим два варианта выбора элементов для подсчета: пользовательский и по созданному фильтру.

Изменено пользователем azaytsev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

VS 2013, Nanocad 5.1 Free

Скажите пожалуйста, из за чего может не увидет линни находящегося на слое?

т.е. слойи находит но не видет линии и полилинии в этих слоях.

 

McObject currObj = currID.GetObject();
 // Распознавание типа объекта
 if (currObj is DbLine)
 {
   //...... DbLine всегда дет false
 }

 

Не знаю какие информаци дать что бы боле понятно обяснить, если что спросите.

Спасибо

Изменено пользователем Laziz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Делайте просто

DBLine line = currID.GetObject();

if(line != null)

{

}

Там implicit конверсия и она приведет если тип подходит.

 

или

if(currObj.ClassID == DBline.TypeID)

 

 

В 6 и 7 нанокаде ваша конструкция сработала бы.

 

В 5 нанокаде еще не было приведения к конечному типу объекта и отдавалась реализация McObject, которая при implicit преобразованиях могла привестись в нужны класс.

 

Все улучшается :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

В 6 и 7 нанокаде ваша конструкция сработала бы.

 

В 5 нанокаде еще не было приведения к конечному типу объекта и отдавалась реализация McObject, которая при implicit преобразованиях могла привестись в нужны класс.

 

Все улучшается :)

Благодарю за ответ, теперь боле понятно стало.

Желаю скорейшего улучшения!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте. Не могли бы вы выложить код данного проекта. Заранее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте. Не могли бы вы выложить код данного проекта. Заранее спасибо!

Код на Хабре есть, ссылка на первом посте!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я все сделал вроде бы как надо, но компилятору не нравится эта строчка

ObjectFilter filter = ObjectFilter.Create(true).AddType(typeof(DbLine)).AddType(typeof(DbPolyline)).AddLayer(layerName);

, а именно typeof(DbLine).

Я считаю что проблема в отсутствующей библиотеки или конфликт имен библиотек, но какой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я все сделал вроде бы как надо, но компилятору не нравится эта строчка

ObjectFilter filter = ObjectFilter.Create(true).AddType(typeof(DbLine)).AddType(typeof(DbPolyline)).AddLayer(layerName);

, а именно typeof(DbLine).

Я считаю что проблема в отсутствующей библиотеки или конфликт имен библиотек, но какой?

ObjectFilter filter = ObjectFilter.Create(true).AddType(DbLine.TypeID).AddType(DbPolyline.TypeID).AddType(DbCircle.TypeID).AddType(DbCircArc.TypeID).AddLayer(layerName);

Попробуйте вот так, кажется я так победил эту строку :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Laziz спасибо, это реально помогло!

 

А еще в nanocad 5.1 не работает эта конструкция:

lengthSum += (currObj as DbLine).Line.Length;

 

Сделал костыль:

DbLine gg = currObj;

lengthSum += gg.Line.Length;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

using Multicad.Runtime;

Возьмите любой пример простой, запустите, чтобы без ошибок было, и его ковыряйте :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

×
×
  • Создать...