Конвертировать множество обьекты в полилинии.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Конвертировать множество обьекты в полилинии.

Конвертировать множество обьекты в полилинии.

Ответ
Поиск в этой теме
Непрочитано 21.04.2010, 02:48 #1
Конвертировать множество обьекты в полилинии.
ACarin
 
студент МГТУ им. Баумана
 
Москва
Регистрация: 16.04.2010
Сообщений: 6

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

Дана огромная матрица. Необходимо конвертировать все квадраты на ней в полилинии длиной и шириной 0.003

Матрица огромная, попытка сделать все и сразу вешает автокад. Даже при попытки сделать одну десятую матрицы все виснет.

Нужна помощь, буду признателен.

Вложения
Тип файла: rar phMask01.03.2010random1024.rar (8.63 Мб, 90 просмотров)

Просмотров: 4843
 
Непрочитано 21.04.2010, 05:31
#2
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


А если сделать массивом из одного отрисованного полилинией квадрата новую матрицу?
Profan вне форума  
 
Непрочитано 21.04.2010, 08:56
#3
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Profan Посмотреть сообщение
А если сделать массивом из одного отрисованного полилинией квадрата новую матрицу?
Судя по ответу, файл вы не открывали.

2 ACarin
В подобных ситуациях не следует пытаться обработать всё сразу. Следует программно выделять маленькими партиями и обрабатывать их. Например в цикле обрабатывать одну колонку. После того, как колонку обработаете - сбрасываете выбранный набор, дабы он не рос как снежный ком и берётесь за следующую. Это будет долго, но, скорее всего, на данный алгоритм памяти вашему компьютеру должно хватить.

Ради интереса я попробовал запустить команды расчленения и конвертации в полилинии сразу для всех объектов вашего массива - получилось, но при этом комп скушал все 6 Гигов памяти + на конвертацию и последующую отмену выбора ушло почти пол часа (пока я завтракал). Задать толщину линии равной 0.003 вы не сможете, т.к. у автокада существует чётко определённый набор допустимых толщин линий и 0.003 в него не входит.

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

И последнее - если не секрет, что это вообще такое? Просто "от балды" надуманная преподавателем проблема на тему "сферического коня в вакууме"?

Последний раз редактировалось hwd, 21.04.2010 в 09:12.
hwd вне форума  
 
Непрочитано 21.04.2010, 10:15
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Представленный код обработал весь массив в течении примерно 2 минут. AutoCAD 2008 Eng + SP1, Windows XP Pro 32 bit SP3, 2GB RAM.
Код:
[Выделить все]
(vl-load-com)

(defun test (/ adoc *error* _kpblc-conv-ent-pline-vertex-to-wcs selset coord mid elist new_ent width)

  (defun _kpblc-conv-ent-pline-vertex-to-wcs (ent / elevation normal)
                                             ;|
*    Функция получения координат легкой полилинии (LWPOLYLINE) в WCS. Возвращает
* список 3Д-точек
*    Автор: BOZ (http://www.autocad.ru/cgi-bin/f1/board.cgi?t=26461HC)
*    Оригинальный код:
(defun lwpoly_vert (lwpoly / plinee elev vnv)
  (setq	plinee (entget lwpoly)
	elev   (cdr (assoc 38 plinee))
	vnv    (cdr (assoc 210 plinee))
	) ;_ end of setq
  (mapcar
    (function (lambda (x) (trans (list (cadr x) (caddr x) elev) vnv 0)))
    (vl-remove-if-not (function (lambda (x) (= (car x) 10))) plinee)
    ) ;_ end of mapcar
  ) ;_ end of defun
*    Параметры вызова:
*	ent	ename-указатель на LWPOLYLINE (контроля не производится)
*    Примеры вызова:
(_kpblc-conv-ent-pline-vertex-to-wcs (car (entsel)))
|;
    (setq elevation (cdr (assoc 38 (entget ent)))
          normal    (cdr (assoc 210 (entget ent)))
          ) ;_ end of setq
    (if (not elevation)
      (setq elevation 0.)
      ) ;_ end of if
    (mapcar '(lambda (x) (trans (list (cadr x) (caddr x) elevation) normal 0))
            (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget ent))
            ) ;_ end of mapcar
    ) ;_ end of defun

  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (setq width 0.003)
  (if (setq selset (ssget '((0 . "LWPOLYLINE") (90 . 4) (70 . 1))))
    (progn
      (foreach ent ((lambda (/ tab item)
                      (repeat (setq tab  nil
                                    item (sslength selset)
                                    ) ;_ end setq
                        (setq tab (cons (ssname selset (setq item (1- item))) tab))
                        ) ;_ end repeat
                      ) ;_ end of lambda
                    )
        (setq coord   (_kpblc-conv-ent-pline-vertex-to-wcs ent)
              mid     (mapcar
                        (function
                          (lambda (a1 b1)
                            (* 0.5 (+ a1 b1))
                            ) ;_ end of lambda
                          ) ;_ end of function
                        (car coord)
                        (caddr coord)
                        ) ;_ end of mapcar
              elist   (entget ent)
              new_ent (entmakex
                        (list (cons 0 "LWPOLYLINE")
                              (cons 100 "AcDbEntity")
                              (assoc 410 elist)
                              (cons 100 "AcDbPolyline")
                              (cons 90 2)
                              (cons 70 0)
                              (cons 43 width)
                              (assoc 38 elist)
                              (assoc 39 elist)
                              (assoc 8 elist)
                              (assoc 210 elist)
                              (cons 10
                                    (list (- (car mid) (/ width 2.))
                                          (cadr mid)
                                          ) ;_ end of list
                                    ) ;_ end of cons
                              (cons 10
                                    (list (+ (car mid) (/ width 2.))
                                          (cadr mid)
                                          ) ;_ end of list
                                    ) ;_ end of cons
                              ) ;_ end of list
                        ) ;_ end of entmakex
              ) ;_ end of setq
        (entdel ent)
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

Код не универсальный и многие вещи может обработать неверно (так, например, не учитывается вариант "поворота" квадрата). Для немировых систем координат не проверял.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.04.2010, 10:27
#5
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Действительно, файл я не открывал... И не буду открывать, раз там нужны квадраты с размером 0.003.
Profan вне форума  
 
Непрочитано 21.04.2010, 11:18
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
Задать толщину линии равной 0.003 вы не сможете, т.к. у автокада существует чётко определённый набор допустимых толщин линий и 0.003 в него не входит.
Не путай вес линии и ширину полилинии. Ширина полилинии может быть любой.
Александр Ривилис вне форума  
 
Непрочитано 21.04.2010, 11:24
#7
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Не путай вес линии и ширину полилинии. Ширина полилинии может быть любой.
да, я невнимательно прочитал - там вообще длина и ширина квадрата...
hwd вне форума  
 
Непрочитано 21.04.2010, 12:41
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от ACarin Посмотреть сообщение
Здравствуйте.
...Матрица огромная, попытка сделать все и сразу вешает автокад. Даже при попытки сделать одну десятую матрицы все виснет...
А как Вы пытались конвертировать? Там пол миллиона квадратиков - не такая и большая.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 21.04.2010, 12:42
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


В коде, который сделал я, есть некоторое количество принципиальных ошибок. Интересно, кто-нибудь их озвучит?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.04.2010, 13:39
#10
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Не вижу там ничего принципиального, кроме как излишне сложное получение точек вершин полилиний!
Вот так:
Код:
[Выделить все]
  (defun _tmp-get-pline-pt (pline)
    (mapcar (function cdr)
     (vl-remove-if-not
       (function (lambda (paar) (= (car paar) 10)))
       (entget pline)
     ) ;_ end of vl-remove-if-not
    ) ;_ end of mapcar
  ) ;_ end of defun
и достаточно В разы быстрее обработает! Текущая СК и так WCS, полилинии тоже в ней нарисованы.
Кстати, entget дважды выполняется - один раз в функции получения координат, второй раз запоминается в переменной elist. Можно было б переделать, чтоб единожды выполнялось.
А, вот еще что, если уж мы используем точку в WCS, то, по-хорошему, при построении полилинии ее надо как-то перевести обратно в СК полилинии (это которая mid). Но опять же, для представленного чертежа это не принципиально...
Цитата:
А как Вы пытались конвертировать? Там пол миллиона квадратиков - не такая и большая.
Когда я попытался просто выделить рамкой эту матрицу, мой AutoCAD завис намертво
Do$ вне форума  
 
Непрочитано 21.04.2010, 14:32
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


ну и это тоже Сначала делал "по уму", потом силы кончились. Я говорил про другое - про то, что эффективнее будет модифицировать имеющиеся примитивы, чем создавать новые.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.04.2010, 14:50
#12
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Хех, а ведь действительно!
Do$ вне форума  
 
Непрочитано 21.04.2010, 15:04
#13
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Do$ Посмотреть сообщение
Когда я попытался просто выделить рамкой эту матрицу, мой AutoCAD завис намертво
У меня 2010 проснулся черезнесколько секунд - но вопрос не в этом - завист-то он из-за того что пытался ваше "выделение" отобразить - это действительно дольше нежили преобразовать их (как это на первый взгляд не странно - но прикинте сами скольеко нужно расчетов для преобразования, а сколько для отображения ручек на каждом). "тупое" ssget "_a" создает набор за секунды (вместе с переводом в список - оттуда я и узнал сколько элементов), а дальше простой mapcar (он императивный и память жрать не будет, хотя в нормальных реализациях лиспа (не авто лиспа) и рекурсивно все пройдет) справиться на ура.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 23.04.2010, 15:56
#14
ACarin

студент МГТУ им. Баумана
 
Регистрация: 16.04.2010
Москва
Сообщений: 6
<phrase 1=


Огромное спасибо, Кулик Алексей aka kpblc

Это, в своем роде, матрица нулей и единиц для лазера.
ACarin вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Конвертировать множество обьекты в полилинии.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Новые команды для работы с полилинией VVA Программирование 647 18.09.2023 11:16
lisp: Длина по полилинии до точки vosh LISP 19 15.07.2013 15:10
выноски к полилинии gizmo_zx Программирование 6 01.03.2010 12:17
Выделение и удаление обьектов внутри замкнутой полилинии. Как? DTwice AutoCAD 5 18.05.2009 14:31