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

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

При создании модулей расширения nanoCAD возникли следующие проблемы:

 

1) не удалось получить атрибуты блока (AcadBlockReference.GetAttributes(), см. тему тынц)

 

2) не удалось получить код класса объекта (AcadEntity.GetEntityType(), см. там-же (решение есть))

 

3) объект SelectionSet ведёт себя не так, как в автокаде и вообще, поведение этого метода доставляет.

При первом вызове метода Select происходит выделение требуемых объектов; при повторном вызове - происходит очистка SelectionSet-a и, затем, выделение новых объектов; в автокаде каждый последующий вызов Select - добавляет новые объекты ко множеству уже выделенных (я считаю, что в автокаде - логичнее и более гибко, т.к. перед Select-ом всегда можно вызвать Clear, если это нужно).

Кроме этого, данный метод не работает (не происходит выделения), если приложение невидимо (Application.Visible == false) - в автокаде абсолютно такое-же поведение, но у нанокада ситуация лучше, т.к. автокад не выделяет объекты даже если они не в текущей видимой области, а нанокад - выделяет в этом случае. Вообще странно, что у нанокада похожее поведение, т.к. он использует библиотеку Teigha (в миру DWGDirect), которая, якобы, написана именно путём обратной разработки dwg - формата:) (http://ru.wikipedia.org/wiki/Open_Design_Alliance)

 

4) не ясна ситуация с координатами и их передачей в качестве параметров. В автокаде координаты передаются в функции через массив из 3-х элементов. Члены массива - варианты, с типом данных double. В нанокаде - координаты точки передаются ввиде строки: "1345.001,4523.0349,873.000"

Всё бы ничего, но при передаче чисел, превышающих 10 000 000 000 возникает ошибка: TeighaX: Arithmetic overflow

В некоторых случаях эта ошибка возникает даже при числах выше 1 000 000 (что печально)

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


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

спасибо, MosS, за ценные замечания, передадим разработчикам. вы также можете писать на support@nanocad.ru

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


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

И у меня при пробной переделке своих программ расширения под Нанокад возникли проблемы.

1) При запуске Нанокада из внешней программы (Delphi7) через COM интерфейс, окно программы запускается без единой панели инструментов (см. приложенный рисунок)

2) Поправил настройки Нанокада по этой инструкции: http://forum.nanocad.ru/index.php?app=core&module=attach&section=attach&attach_id=659, "кракозябры" вместо текста и примитивов при нормальном (ручном) запуске и открытии чертежа вроде бы пропали. Но при программном открытии Нанокада через COM интерфейс и программной прорисовке текста и примитивов, "кракозябры" присутствуют (даже перекрестье курсора портится), пока не будет выполнена команда "Обновить" вручную.

3) Команда "Обновить" отданная программно через COM интерфейс (Delphi7), вызывает исключение, которое мы можем видеть на прилагаемом рисунке.

Код:

acad.ActiveDocument.Regen(acActiveViewport);
acad.Application.ZoomExtents;

Исключение возникает на первой строке, без нее все остальные команды отрабатывают.

NanoError.JPG

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


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

1) При запуске Нанокада из внешней программы (Delphi7) через COM интерфейс, окно программы запускается без единой панели инструментов (см. приложенный рисунок)

 

Проблема известна и уже исправлена. Войдёт в следующую сборку.

 

2) Поправил настройки Нанокада по этой инструкции: http://forum.nanocad.ru/index.php?app=core&module=attach&section=attach&attach_id=659, "кракозябры" вместо текста и примитивов при нормальном (ручном) запуске и открытии чертежа вроде бы пропали. Но при программном открытии Нанокада через COM интерфейс и программной прорисовке текста и примитивов, "кракозябры" присутствуют (даже перекрестье курсора портится), пока не будет выполнена команда "Обновить" вручную.

3) Команда "Обновить" отданная программно через COM интерфейс (Delphi7), вызывает исключение, которое мы можем видеть на прилагаемом рисунке.

Код:

acad.ActiveDocument.Regen(acActiveViewport);
acad.Application.ZoomExtents;

Исключение возникает на первой строке, без нее все остальные команды отрабатывают.

 

По видимому, Вы создаёте примитивы в области, далёкой от центра окна. Тут помогла бы программная регенерация. Но, метод Activedocument.Regen() не реализован, поэтому и возникает исключение. Постараемся исправить к следующей сборке.

 

Присылайте пример, может быть получится что-нибудь придумать.

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


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

По видимому, Вы создаёте примитивы в области, далёкой от центра окна.

Именно так, геодезия, все в реальных координатах, а они очень большие.

 

Тут помогла бы программная регенерация. Но, метод Activedocument.Regen() не реализован, поэтому и возникает исключение.

Да, именно на это я и хотел обратить Ваше внимание. Без регенерации - все плохо, а программная не работает..

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


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

По видимому, Вы создаёте примитивы в области, далёкой от центра окна.

 

2 ISL: скажите плз. а какой тип данных используется для хранения координат?

просто у меня иногда возникает: TeighaX: Arithmetic overflow

иногда при работе с числами порядка 10**9 а иногда и с числами порядка 10**6

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


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

Используется double. Присылайте пример, посмотрим под отладчиком, что там происходит.

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


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

2 ISL: скажите плз. а какой тип данных используется для хранения координат?

просто у меня иногда возникает: TeighaX: Arithmetic overflow

иногда при работе с числами порядка 10**9 а иногда и с числами порядка 10**6

Дело не в типе числа хранящего координаты, оно может быть и учетверенной точности - дело это не поправит. В другой ветке я давал ссылку на обсуждение этой проблемы на сайте геймдевелоперов. В двух словах так: Неважно числами какой точности оперирует программа, драйвер/железо ВИДИМОКАРТОЧЕК обрабатывает координаты только как тип Single, т.е. 7 разрядов мантиссы (неважно где при этом находится запятая) и порядок (*10 в степени). Иногда может задействован восьмой разряд, но в нем может быть только единица. Поэтому все координаты в драйвере/железе видеокарты округляются к этим 7 разрядам, снова таки неважно где находится запятая. Если программа учитывает это обстоятельство ( Автокад "упирается" в пределы масштабирования - нужно делать реген), то все отображается путем, если нет - то видим кракозябры.

ЗЫ: Просто сам прошел через решение этой проблемы при написании ГИС на OpenGL.

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


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

В продолжение первого сообщения этого топика:

Сегодня попробовал получить программно элемент чертежа (конкретно полилинию, хотя это по всей видимости не принципиально).

 

Basepnt, promt, disp:olevariant;
ent: IAcadEntity;

promt:= 'Выберите объект : ';
 try
   ADoc.Utility.GetEntity(disp, Basepnt, promt);

В процессе выполнения этой строки, в окне Нанокада появился текст (promt), курсор стал "квадратиком" как и положено при выборе, 
в программу вернулась не пустая переменная disp, однако далее ее так и не получилось привести к виду, который может быть использован 
в дальнейшей работе.

 except
   showmessage('Ошибка получения координат.');
   exit;
 end;

ent:=disp as AcadEntity; // Приведение типа  - здесь вылетаем с ошибкой, в Автокаде все работает пучком

Подумалось, может несовсем верно Делфи импортировал библиотеку типов:

Обявление процедуры в nanoCAD_TLB: 

procedure GetEntity(var Object_: OleVariant; var PickedPoint: OleVariant; Prompt: OleVariant); safecall;

Обявление процедуры в AutoCAD.tlb:

procedure GetEntity(out Object_: IDispatch; out PickedPoint: OleVariant; Prompt: OleVariant); safecall;

Бегло попробовал поиграться типами, но ничего не получилось, а времени разбираться много небыло.

Может у кого то получилось нормально получать элементы чертежа? Поделитесь пожалуйста примером, или соображением, что я делаю неверно?

 

ЗЫ:По ссылке в первом посте другой способ получения элемента чертежа, который не может заменить этот.

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


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

Здравствуйте.

Хотелось бы уточнить, реализован ли метод Boolean для 3DSolid, а также AddRegion.

При попытке использования их в приложении возникает ошибка: "Интерфейс не поддерживается" - хотя в документации оба этих метода описаны.

Заранее благодарен.

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


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

Здравствуйте.

Хотелось бы уточнить, реализован ли метод Boolean для 3DSolid, а также AddRegion.

При попытке использования их в приложении возникает ошибка: "Интерфейс не поддерживается" - хотя в документации оба этих метода описаны.

Заранее благодарен.

Все операции с телами должны обслуживаться специальной компонентой - 3D моделлером, которого нет в составе nanoCAD. В будущем возможно он появиться, но вряд ли в составе бесплатного продукта. Гляньте en.wikipedia.org/wiki/Geometric_modeling_kernel

PS: Документацию конечно поправим.

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


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

Кстати, а почему бы базовые операции с объемами не включить и в общую, бесплатную часть? Все равно одними ими что-то серьезное сделать толком не получится. По крайней мере, я бы ни за что не согласился проектировать что-то серьезное в объеме средствами голого автокада, потребовал хотя бы Mechanical Desktop.

 

Я про создание объема движением образующей и операции объединения, пересечения, вычитания. Ну и общие команды сдвига, поворота, масштабирования.

Подозреваю, что достаточно часто для экономии места в файле сплошные объемы именно посредством команд создания и описываются, так что придется только предоставить команды для доступа к уже имеющимся процедурам.

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


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

Кстати, а почему бы базовые операции с объемами не включить и в общую, бесплатную часть? Все равно одними ими что-то серьезное сделать толком не получится. По крайней мере, я бы ни за что не согласился проектировать что-то серьезное в объеме средствами голого автокада, потребовал хотя бы Mechanical Desktop.

:) Небольшой ликбез: Во всём мире существует очень ограниченное количество 3D моделлеров, оперирующих телами - это сложные научные разработки, адаптированные под конкретное применение в реальном САПР и конечно не бесплатные. Их можно перечислить по пальцам: Acis, Parasolid, ShapeManager, Catia (старая) (без лиц. API), Catia (новая) (без лиц. API), Granite. Отечественные - 3D ядро Компас (Коломна), Китеж (Н. Новгород). Отдельно, условно бесплатные - BRL-Cad (имхо-тупиковая ветвь) и OpenCASCADE (Франция + Н. Новгород).

В Автокаде и в MDT, соответственно, используется выкупленная и модифицированная Autodesk версия Acis.

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


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

Это я знаю (из конкретных названий, правда, только чуть больше половины встречал).

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

Хотя даже этот ограниченный функционал просто так на коленке не напишешь - лично я даже не понял толком, как в тех же Acis и Parasolid тела описываются. Поэтому не уверен, что бесплатны "облегченные" версии этих движков, используемые в бесплатных утилитах визуализации, предоставляемых авторами САПР.

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


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

2 ShurikR:

 

Basepnt, promt, disp:olevariant;
ent: IAcadEntity;

promt:= 'Выберите объект : ';
 try
   ADoc.Utility.GetEntity(disp, Basepnt, promt);

 

В текущей реализации входные параметры GetEntity() должны быть пустыми, точнее, не должны содержать VT_DISPATCH. Не знаю, на что нужно заменить olevariant на Delphi, на С# выглядит так:

 

object o = null, p = null;
doc.Utility.GetEntity(ref o, ref p, "");

AcadLine line = o as AcadLine;

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


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

2 ISL: Спасибо за ответ! Долго не появлялся тут на форуме, потому как показалось, что найденные пользователями ошибки, разработчиков не интересуют...

 

Рабочий код на Делфи для получения примитивов из чертежа, выглядит так:

procedure GetCoordinates;
var
 Crdnts:variant;
 Basepnt,promt,disp:olevariant;

begin
 promt:= 'Выберите объект: ';
 try
   ADoc.Utility.GetEntity(disp, Basepnt, promt);
 except
   showmessage('Ошибка получения координат участка. Повторите ввод снова.');
   exit;
 end;

// Проверяем, полученный объект является полилинией?
  if disp.ObjectName <> 'AcDbPolyline' then
   begin
     showmessage('Выбранный объект не является полилинией. Повторите ввод снова.');
     exit;
   end;

// Пролучаем координаты взятой из чертежа полилинии
  Crdnts:= disp.Coordinates;
end;

Может кому то пригодится.

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

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


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

1) При запуске Нанокада из внешней программы (Delphi7) через COM интерфейс, окно программы запускается без единой панели инструментов (см. приложенный рисунок)

 

Проблема известна и уже исправлена. Войдёт в следующую сборку.

 

2) Поправил настройки Нанокада по этой инструкции: http://forum.nanocad.ru/index.php?app=core&module=attach&section=attach&attach_id=659, "кракозябры" вместо текста и примитивов при нормальном (ручном) запуске и открытии чертежа вроде бы пропали. Но при программном открытии Нанокада через COM интерфейс и программной прорисовке текста и примитивов, "кракозябры" присутствуют (даже перекрестье курсора портится), пока не будет выполнена команда "Обновить" вручную.

3) Команда "Обновить" отданная программно через COM интерфейс (Delphi7), вызывает исключение, которое мы можем видеть на прилагаемом рисунке.

Код:

acad.ActiveDocument.Regen(acActiveViewport);
acad.Application.ZoomExtents;

Исключение возникает на первой строке, без нее все остальные команды отрабатывают.

 

По видимому, Вы создаёте примитивы в области, далёкой от центра окна. Тут помогла бы программная регенерация. Но, метод Activedocument.Regen() не реализован, поэтому и возникает исключение. Постараемся исправить к следующей сборке.

 

Присылайте пример, может быть получится что-нибудь придумать.

 

Попробовал эту же самую программу заставить поработать с новым Нанокадом 3.5, результаты следующие:

 

1) При запуске NanoCad-a из своей программы по СОМ - интерфейсу, все запустилось как положено, все панели инструментов на месте, все работает как надо

 

2) "Кракозябры" все так же присутствуют.. Да, геодезия, координаты порядка Х ХХХ ХХХ.ХХХХ, увы..

 

3) Программный вызов команды Regen исключений не вызывает, но и ничего не делает, по крайней мере, после вызова этой команды, на экране ничего не меняется, "кракозябры" как были, так и остаются..

 

3.5) При прошлом испытании программы, с предыдущей версией NanoCad-a, вызов команды "Обновить" вручную вызывал обновление чертежа и устранение "кракозябров", в NanoCad 3.5, запущенном по СОМ интерфейсу сторонней программой, запуск вручную команды "Обновить" не приводит ни к каким результатам. Если чертеж сохранить, а затем открыть снова, то все становится на места, "кракозябры" исчезают сами. Скорее всего, NanoCad запущенный из другой программы, реагирует не на все команды, или реагирует неверно.

 

А вообще, уже стало намного приятнее работать с новым NanoCad-ом, СПАСИБО!

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


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

В текущей реализации входные параметры GetEntity() должны быть пустыми, точнее, не должны содержать VT_DISPATCH. Не знаю, на что нужно заменить olevariant на Delphi, на С# выглядит так:

 

object o = null, p = null;
doc.Utility.GetEntity(ref o, ref p, "");

AcadLine line = o as AcadLine;

В nanoCAD 3.5 проблема исправлена, теперь GetEntity() работает привычным образом, входные параметры могут содержать VT_DISPATCH от предыдущего вызова GetEntity().

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


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

 

В nanoCAD 3.5 проблема исправлена, теперь GetEntity() работает привычным образом, входные параметры могут содержать VT_DISPATCH от предыдущего вызова GetEntity().

 

Спасибо за уточнение. Выше я привел код на Делфи, взятый из работающей программы, т.е. 100% рабочий, проверенный на nanoCAD 3.5 в том числе. Его можно использовать как есть, без переделок.

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


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

3) Программный вызов команды Regen исключений не вызывает, но и ничего не делает, по крайней мере, после вызова этой команды, на экране ничего не меняется, "кракозябры" как были, так и остаются..

 

3.5) При прошлом испытании программы, с предыдущей версией NanoCad-a, вызов команды "Обновить" вручную вызывал обновление чертежа и устранение "кракозябров", в NanoCad 3.5, запущенном по СОМ интерфейсу сторонней программой, запуск вручную команды "Обновить" не приводит ни к каким результатам. Если чертеж сохранить, а затем открыть снова, то все становится на места, "кракозябры" исчезают сами. Скорее всего, NanoCad запущенный из другой программы, реагирует не на все команды, или реагирует неверно.

 

Попробуйте включить Сервис->Настройка->Системные настройки->Свой дисплейный лист на каждый видовой экран пространства модели.

 

По умолчанию, центр регенерации вычисляется один раз при создании или открытии чертежа. При включении вышеупомянутой настройки, центр регенерации будет пересчитываться при каждом regen-е.

 

Должены заработать и ручная, и программная регенерация.

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


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

Попробуйте включить Сервис->Настройка->Системные настройки->Свой дисплейный лист на каждый видовой экран пространства модели.

 

Включил указанную Вами опцию в системных настройках. Результат:

- Программный РЕГЕН по прежнему не работает, но как было описано раньше, исключений в программе не вызывает

- Ручной вызов РЕГЕНЕРАЦИЯ из меню Нанокада действительно заработал, чертеж обновился и "кракозябры" пропали.

 

Жаль что программная регенерация не работает, это здорово уменьшает возможности автоматизации.

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


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

При работе через Com интерфейс программа под Delphi стопорится на вот этой строчке. Что в ней не так?

Код ошибки - неверное имя заливки

Hatch:=DrawSpace.AddHatch(acPreDefinedGradient, 'ANSI31', True, acHatchObject);

 

Аналогично с "AddPolyline(VerticesList);" Список вершин передаваемый как OleVariant не работает, аналогичная функция под AutoCAD норм фурычит.

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

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


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

Как Вы работаете через COM интерфейс? Позднее или раннее связывание?

 

Можно код, как вы создаете полилинию?

 

Штриховка у меня вполне создается. Делаю так:

 

var
   DrawSpace : AcadModelSpace;
   hatch : AcadHatch;
   Crdnts:variant;
   Basepnt,promt,disp:olevariant;
begin
...
 promt:= 'Select object: ';
 try
   doc.Utility.GetEntity(disp, Basepnt,  promt);
 except
   showmessage('Error');
   exit;
 end;
hatch := DrawSpace.AddHatch(1, 'ANSI31', True, 0);
hatch.AppendOuterLoop(disp);
end;

Полилинию выбираю в модели. И у меня раннее связывание.

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


Ссылка на сообщение
Поделиться на другие сайты
function GetRectangelListPoints(BasePoint:OleVariant;W,H:Real): OleVariant;
var
PointB: OleVariant;
begin
PointB:=VarArrayCreate([0, 11], varDouble);
PointB[0]:=BasePoint[0]; //начальная X координата
PointB[1]:=BasePoint[1]; //начальная Y координата
PointB[2]:=BasePoint[2]; //начальная Z координата
PointB[3]:=BasePoint[0]+W; //начальная X координата
PointB[4]:=BasePoint[1]; //начальная Y координата
PointB[5]:=BasePoint[2]; //начальная Z координата
PointB[6]:=BasePoint[0]+W; //начальная X координата
PointB[7]:=BasePoint[1]-H; //начальная Y координата
PointB[8]:=BasePoint[2]; //начальная Z координата
PointB[9]:=BasePoint[0]; //начальная X координата
PointB[10]:=BasePoint[1]-H; //начальная Y координата
PointB[11]:=BasePoint[2]; //начальная Z координата
Result:=PointB;
end;

procedure ........
var
h,w:Real;
ListPoints,vBasePoint:OleVariant;
begin
ListPoints:=GetRectangelListPoints(GetOleVariantPoint(BasePoint[0]-w/2,BasePoint[1]+h/2,BasePoint[2]),w,h);
CADPolyLine:=ModelSpace.AddPolyline(ListPoints);
end;

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...

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