Разрезать Region

Автор Тема: Разрезать Region  (Прочитано 48539 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #15 : 02-06-2014, 14:42:25 »
Обнаружил ошибку в результате работы своего кода... Слева направо: регион на основе сплайна, результат narez, результат meshregions. В моём результате присутствует щель между первым и вторым рядом, как показано на скрине. При резке других регионов такого нет.

Ещё обнаружил, что при сильном приближении конур моих полученных регионов не совпадает с контуром исходного региона, подлежащего резке. На третьем скрине нижняя зелёная линия - контур исходного региона, а верхняя - контур полученных резкой (выполнен regen). Это случай, когда исходный регион был создан на основе окружности. Эта проблема наблюдается как в моём решении, так и в narez.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Разрезать Region
« Ответ #16 : 02-06-2014, 14:52:22 »
ИХМО для автокада лисп хоть немного, но знать необходимо (чтоб велосипеды не делать), по первому вопросу - ну тож функция, а не команда - подразумевается, что будет во что-то завернута, а там и отмены и выбор и прочее - как-то так:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2. (defun c:narez()
  3.   ((lambda (doc ss)
  4.      (if ss ((lambda (width height)
  5.                   (vla-startundomark doc)
  6.                   (mapcar '(lambda (ent) (narez ent width height))
  7.                       (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  8.                   (vla-endundomark doc))
  9.              (getdist "\nШирина ")
  10.              (getdist "\nВысота "))))
  11.    (vla-get-activedocument(vlax-get-acad-object))
  12.    (ssget '((0 . "region")))))
по неточности - то наверное привет от автокада - вполне возможно что это просто неточности отображения примитивов - попробуй регенерацию.
з.ы. подправил - форматирование "плясало"
« Последнее редактирование: 02-06-2014, 15:06:32 от Дима_ »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #17 : 02-06-2014, 14:55:18 »
попробуй регенерацию.
Цитата: Андрей Бушман
(выполнен regen)

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Разрезать Region
« Ответ #18 : 02-06-2014, 15:02:14 »
(выполнен regen)
Проскочил - скорее всего это визуализация проблемы точности вычисления float числа (типа так какой-нибудь синус посчитал)...
p.s. если есть желание "разогнать" свой вариант могу "накоментировать" код.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #19 : 02-06-2014, 15:14:19 »
твой код работает гораздо быстрее. Кроме того, в нём не вижу ошибки, обозначенной выше в моём решении. Копипаст не компилирует твой код. Полагаю, что показан фрагмент, а не весь исходник.
Цитировать
Error   11   Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'. Only the last source file of an application may omit such a declaration.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Разрезать Region
« Ответ #20 : 02-06-2014, 15:29:55 »
Я просто "мелочь" компилирую из *.FSX (в начале) идут строки типа:
#r "c:/program files/autodesk/autocad 2014/acmgd.dll"
#r "c:/program files/autodesk/autocad 2014/acdbmgd.dll"
#r "c:/program files/autodesk/autocad 2014/accoremgd.dll"
а в VS сервис->внешние инструменты настроены различные компиляции (exe 2.0, exe 4.0, dll, standalone dll,...) - ихмо так удобней. В привычном варианте установи библиотеки и добавь1-ю строку типа module narez

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #21 : 02-06-2014, 15:56:17 »
Разница по скорости (поочерёдно резал объекты командами narez и meshregions):
Цитата: AutoCAD 2014
Command: NAREZ

Select objects: 1 found

Select objects:
РЁРёСЂРёРЅР° 10
Высота 10
Затраченное время: 00:00:00.7099610
nil

Command:
Command: MESHREGIONS

Выберите области (Regions) для добавления их в набор: 1 found

Выберите области (Regions) для добавления их в набор:

Всего выбрано областей (Regions): 1
dx <10>:

dy <10>:


Создано областей (region): 160
Затраченное время: 00:00:00.8574218

Command: NAREZ

Select objects: 1 found

Select objects:

РЁРёСЂРёРЅР° 10

Высота 10
Затраченное время: 00:00:00.7148438
nil

Command:
Command: MESHREGIONS

Выберите области (Regions) для добавления их в набор: 1 found

Выберите области (Regions) для добавления их в набор:

Всего выбрано областей (Regions): 1
dx <10>:

dy <10>:


Создано областей (region): 158
Затраченное время: 00:00:00.8476563

Command: NAREZ

Select objects: 1 found

Select objects:

РЁРёСЂРёРЅР° 10

Высота 10
Затраченное время: 00:00:00.5317500
nil

Command:
Command: MESHREGIONS

Выберите области (Regions) для добавления их в набор: 1 found

Выберите области (Regions) для добавления их в набор:

Всего выбрано областей (Regions): 1
dx <10>:

dy <10>:


Создано областей (region): 132
Затраченное время: 00:00:00.7197266

Command: NAREZ
Select objects: 1 found

Select objects:
РЁРёСЂРёРЅР° 10
Высота 10 Затраченное время: 00:01:05.3681641
nil

Command:
Command: MESHREGIONS

Выберите области (Regions) для добавления их в набор: 1 found

Выберите области (Regions) для добавления их в набор:
Всего выбрано областей (Regions): 1
dx <10>:
dy <10>:

Создано областей (region): 38865
Затраченное время: 00:02:16.3663656
Однако при использовании твоего кода на больших объемах исходных данных, как правило, получаю проблему:
Цитировать
---------------------------
AutoCAD Error Aborting
---------------------------


FATAL ERROR:  Out of memory - shutting down


---------------------------
ОК   
---------------------------
с последующим Fatal Error. Зачастую это происходит при первом автоматическом сохранении чертежа, в котором нарезкой уже создано огромное количество регионов. Полагаю, что у тебя происходит утечка памяти (например не все нужные Dispose вызываешь).


Цитировать
В привычном варианте установи библиотеки и добавь1-ю строку типа module narez
В строке
(rg,Intersect.ExtendThis,pc,0n,0n)получаю исключение:
Цитировать
Error   11   This expression was expected to have type
    int   
but here has type
    nativeint   

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #22 : 02-06-2014, 16:04:50 »
В строке

(rg,Intersect.ExtendThis,pc,0n,0n)получаю исключение:

Цитировать
Error   11   This expression was expected to have type
    int   
but here has type
    nativeint
   
Убрал суффиксы "n" - всё скомпилировалось. Однако в свете обозначенной выше проблемы с утечкой памяти, пока откладываю в сторону.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #23 : 02-06-2014, 16:13:02 »
заниматься Intersect'ом не на каждой итерации - а анализируя геометрию прохождения границ (строки 55-65):
можешь перевести эти строки на C#, чтобы я смог их прочесть?

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Разрезать Region
« Ответ #24 : 02-06-2014, 16:21:29 »
Убрал суффиксы "n" - всё скомпилировалось.
По моему там чуть разные перегрузки метода в различных версиях автокада (под 2014 компилировал точно как в примере).
Про утечку - посмотрю - приложи dwg файлик.
"в прямую" их не перевести - вечером закоментирую.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #25 : 02-06-2014, 16:28:23 »
Про утечку - посмотрю - приложи dwg файлик.
Тестировал на этом файле, предварительно скопировав содержимое два раза и затем всё это отправив в обработку (нарезку). Windows 7x86.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Разрезать Region
« Ответ #26 : 02-06-2014, 16:30:32 »
"шаг резьбы"?

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #27 : 02-06-2014, 16:35:39 »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #28 : 02-06-2014, 16:56:12 »
Две копии одного и того же региона. Слева режется моим кодом на куски размером 52.391x52.391, а справа - на куски 52.392x52.392. Разница в 0.001, а результат различен...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разрезать Region
« Ответ #29 : 02-06-2014, 16:58:52 »
Я же писал о минимальной относительной погрешности в 1e-6. Вот похоже она и вылезла.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение