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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как изменить масштаб MPOLIGON-ов относительно их центроидов?

Как изменить масштаб MPOLIGON-ов относительно их центроидов?

Ответ
Поиск в этой теме
Непрочитано 20.11.2008, 20:35 #1
Как изменить масштаб MPOLIGON-ов относительно их центроидов?
Olga_@@@
 
Екатеринбург
Регистрация: 14.03.2008
Сообщений: 678

Люди добрые!!! Помогите, а то помру...
Задачка такая: есть примерно 30 тыс. объектов MPOLIGON их все надо уменьшить (или увеличить), каждый относительно своего центра. Возможно такое?

Работаю в Autodesk Map 2005, но вроде бы и базовый Автокад эти примитивы понимает. Но, если нет, то их можно поменять на 2DPOLYLINE.

Помогите, пожалуйста. Понимаю, что всем сейчас некогда, но очень вас прошу.
Просмотров: 3724
 
Непрочитано 20.11.2008, 20:55
#2
T-Yoke

Артиллерист - вертолётчик. Дипломированный инженер-механик. Technologist
 
Регистрация: 29.11.2004
Где-то около Москвы
Сообщений: 16,516
Отправить сообщение для T-Yoke с помощью Skype™


Не очень представляю как это у вас выглядит, вы бы хоть кусочек скриншота дали, что ли.
Но если можно было ваши объекты преобразовать в блоки с центром в центральной точке вашего исходного объекта, то далее просто масштабировать все эти блоки с переопределением их в чертеже, думаю могло бы помочь.
__________________
«Артиллерия не токмо грохот, но и наука!» Пётр I
T-Yoke вне форума  
 
Непрочитано 20.11.2008, 22:05
#3
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Ну, если "центр" объекта это то, что во вложенном jpg, а объект будет 2d полилинией, то можно программку написать на VBA (само-собой, на лиспе тоже, но его я не знаю). Правда, для 30000 объектов - время выполнения будет, наверное, приличное...
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 71
Размер:	15.7 Кб
ID:	12465  
AlexV вне форума  
 
Автор темы   Непрочитано 20.11.2008, 23:01
#4
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


Пример в прикрепленном файле.
Там 2 полигона: меньший получен из большого уменьшением в 2 раза относительно красной точки. Если его увеличить в 2 раза относительно той же точки, он востановит свои прежние размеры и положение в пространстве. Голубая точка - это центроид большого полигона. Если масштабировать относительно центроида, то при обратном увеличении полигон сместится от первоначального положения, а это совсем нежелательно.
вот еще скриншот на всякий случай.
Вложения
Тип файла: dwg
DWG 2004
polygon.dwg (30.7 Кб, 511 просмотров)

Последний раз редактировалось Olga_@@@, 20.11.2008 в 23:11. Причина: изменила рисунок
Olga_@@@ вне форума  
 
Непрочитано 20.11.2008, 23:52
#5
T-Yoke

Артиллерист - вертолётчик. Дипломированный инженер-механик. Technologist
 
Регистрация: 29.11.2004
Где-то около Москвы
Сообщений: 16,516
Отправить сообщение для T-Yoke с помощью Skype™


Тут вообщем проблема в количестве и разнообразии ваших полигонов. Если их несколько десятков, то еще можно поковырятся и переделать в блоки, а вот если речь о тысячах... Что-то лениво
А для указанных полигонов метод о котором я писал работает. Попробуйте масштабировать относительно точки вставки блока. И все получается, никуда он не смещается!
Вложения
Тип файла: dwg
DWG 2004
polygon3.dwg (30.0 Кб, 509 просмотров)
__________________
«Артиллерия не токмо грохот, но и наука!» Пётр I
T-Yoke вне форума  
 
Непрочитано 21.11.2008, 00:21
#6
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
каждый относительно своего центра
Относительно какого центра?
Sleekka вне форума  
 
Автор темы   Непрочитано 21.11.2008, 00:30
#7
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


Цитата:
Сообщение от Sleekka Посмотреть сообщение
Относительно какого центра?
Относительно красной точки в приведенном выше примере. Не знаю, как её правильно обозвать, но не центроид.
Olga_@@@ вне форума  
 
Непрочитано 21.11.2008, 00:43
#8
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


А понял - это map.
Вот это поможет правда у меня под рукой ничего нет поэтому без каких либо намеков на грамотный код:
Код:
[Выделить все]
(defun sl_go (/ lstLen ss sl_gg sl_list_point_) 
  (setq sl_gg (getvar "osmode"))
  (setvar "osmode" 1024)
  (setq ss (ssget  '((0 . "MPOLYGON"))))
  (setq lstLen (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(foreach sl_ent lstLen
  (princ (setq sl_list_point_ (cdr (assoc 11 (entget sl_ent)))))
  (vl-cmdf "_.scale" sl_ent "" sl_list_point_ 2)
)

  (setvar "osmode" sl_gg)
  )

(sl_go)
Sleekka вне форума  
 
Автор темы   Непрочитано 21.11.2008, 00:50
#9
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


Цитата:
Сообщение от T-Yoke Посмотреть сообщение
Тут вообщем проблема в количестве и разнообразии ваших полигонов. Если их несколько десятков, то еще можно поковырятся и переделать в блоки, а вот если речь о тысячах... Что-то лениво
А для указанных полигонов метод о котором я писал работает. Попробуйте масштабировать относительно точки вставки блока. И все получается, никуда он не смещается!
Количество зашкаливает, так что вариант с блоками не пройдет к сожалению. Тем более, что там еще таблицы объектных данных привязаны и нельзя их терять.
Olga_@@@ вне форума  
 
Непрочитано 21.11.2008, 02:14
#10
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Вот на VBA для полилиний:
Код:
[Выделить все]
Sub main()
Dim objSelSet As AcadSelectionSet
Dim objSelCol As AcadSelectionSets
Dim ScaleFactor, BasePoint(0 To 2) As Double
Dim intType(0) As Integer
Dim varData(0) As Variant
Dim LWPOLobj As AcadLWPolyline
Dim minExt As Variant
Dim maxExt As Variant
Set objSelCol = ThisDrawing.SelectionSets
For Each objSelSet In objSelCol
 If objSelSet.Name = "Blck" Then
  objSelSet.Delete
  Exit For
 End If
Next
Set objSelSet = ThisDrawing.SelectionSets.Add("Blck")
intType(0) = 0
varData(0) = "LWPOLYLINE"
objSelSet.Select acSelectionSetAll, , , intType, varData
If objSelSet.Count > 0 Then
  On Error GoTo err_ch
  ScaleFactor = InputBox("Введите масштабный коэффициент", "Масштаб", 1)
  ScaleFactor = Val(Replace(ScaleFactor, ",", "."))
  For Each LWPOLobj In objSelSet
   If LWPOLobj.Closed = True Then
    LWPOLobj.GetBoundingBox minExt, maxExt
    BasePoint(0) = (minExt(0) + maxExt(0)) / 2
    BasePoint(1) = (minExt(1) + maxExt(1)) / 2
    BasePoint(2) = minExt(2)
    LWPOLobj.ScaleEntity BasePoint, ScaleFactor
   End If
  Next
End If
End
err_ch:
If Err.Number = 13 Then
 MsgBox "Неверный ввод"
 Resume
End If
End Sub
Хотя для полигона тоже должно работать:
Код:
[Выделить все]
Sub main()
Dim objSelSet As AcadSelectionSet
Dim objSelCol As AcadSelectionSets
Dim ScaleFactor, BasePoint(0 To 2) As Double
Dim intType(0) As Integer
Dim varData(0) As Variant
Dim MPOLobj
Dim minExt As Variant
Dim maxExt As Variant
Set objSelCol = ThisDrawing.SelectionSets
For Each objSelSet In objSelCol
 If objSelSet.Name = "Blck" Then
  objSelSet.Delete
  Exit For
 End If
Next
Set objSelSet = ThisDrawing.SelectionSets.Add("Blck")
intType(0) = 0
varData(0) = "MPOLYGON"
objSelSet.Select acSelectionSetAll, , , intType, varData
If objSelSet.Count > 0 Then
  On Error GoTo err_ch
  ScaleFactor = InputBox("Введите масштабный коэффициент", "Масштаб", 1)
  ScaleFactor = Val(Replace(ScaleFactor, ",", "."))
  For Each MPOLobj In objSelSet
    MPOLobj.GetBoundingBox minExt, maxExt
    BasePoint(0) = (minExt(0) + maxExt(0)) / 2
    BasePoint(1) = (minExt(1) + maxExt(1)) / 2
    BasePoint(2) = minExt(2)
    MPOLobj.ScaleEntity BasePoint, ScaleFactor
  Next
End If
End
err_ch:
If Err.Number = 13 Then
 MsgBox "Неверный ввод"
 Resume
End If
End Sub
AlexV вне форума  
 
Автор темы   Непрочитано 21.11.2008, 08:49
#11
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


Спасибо. Сейчас попробую.
Olga_@@@ вне форума  
 
Непрочитано 21.11.2008, 08:52
#12
Кулик Алексей aka kpblc
Moderator

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


Меня терзают смутные подозрения, что MPOLYGON - объект самого Map'a и может обладать своим набором свойств и методов...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.11.2008, 09:36
#13
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


Цитата:
Сообщение от AlexV Посмотреть сообщение
Вот на VBA
Урррааааааа!!!!
Работает!!!!!!! Все как надо и таблицы не отваливаются

Сейчас попробую основной файл обработать.
Olga_@@@ вне форума  
 
Непрочитано 21.11.2008, 09:42
#14
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,685


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Меня терзают смутные подозрения, что MPOLYGON - объект самого Map'a и может обладать своим набором свойств и методов...
Ну в общем, да. Хотя "голый" Acad его читает как "MPOLYGON", но в объектной модели я его не нашел. Ну и ничего, объявил переменную как variant, а методу ScaleEntity, судя по всему, до балды, какой примитив в переменной.
AlexV вне форума  
 
Непрочитано 21.11.2008, 09:59
#15
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Вариантик, без ком строки...
Код:
[Выделить все]
(defun c:test (/ C I S)
 (princ "\n Выберите многоугольники: \t")
 (if
  (and (setq s (ssget '((0 . "MPOLYGON")))) (setq i (getreal "\n Введите масштаб:\t")))
  (foreach a (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex s)))
   (setq c (cdr (assoc 11 (entget a))))
   (vla-TransformBy (vlax-ename->vla-object a)
                    (vlax-tmatrix (list (list i 0. 0. (- (car c) (* (car c) i)))
                                        (list 0. i 0. (- (cadr c) (* (cadr c) i)))
                                        (list 0. 0. i (- (caddr c) (* (caddr c) i)))
                                        '(0. 0. 0. 1.)
                                  ) ;_  list
                    ) ;_  vlax-tmatrix
   ) ;_  vla-TransformBy
  ) ;_  foreach
 ) ;_  if
 (princ)
)
Елпанов Евгений вне форума  
 
Непрочитано 21.11.2008, 10:35
#16
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Здесь еще можно посмотреть
Нужен ЛИСП по масштабированию
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 21.11.2008, 14:40
#17
Olga_@@@


 
Регистрация: 14.03.2008
Екатеринбург
Сообщений: 678
<phrase 1= Отправить сообщение для Olga_@@@ с помощью Skype™


Спасибо всем и особенно AlexV и Евгению Елпанову.
Все отлично, задача решена! Скорость обработки на больших объемах, кстати, очень даже приличная, примерно 1 мин. Многие штатные команды Autodesk Map тормозят гораздо сильнее (и это еще мягко сказано).

VVA, ваш код тоже классный, он более универсальный и в нем больше учтено, но и действий тоже больше.

Map-овские объекты, конечно, не подарок Здорово, что все срослось!
Я то боялась, что может не получится... а, зря боялась
Спасибо
Olga_@@@ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как изменить масштаб MPOLIGON-ов относительно их центроидов?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить масштаб не зная коэффициент Denim_ok AutoCAD 4 05.08.2008 19:31
Как изменить ссылку с attachment на overlay? Елена AutoCAD 3 20.08.2004 14:54
как изменить окраску изометрии sdndrey AutoCAD 1 01.06.2004 08:55
как изменить окраску 3D модели sdndrey AutoCAD 3 31.05.2004 23:55
как изменить радиус окружности sasa AutoCAD 11 02.12.2003 02:23