Нужен ЛИСП по масштабированию
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен ЛИСП по масштабированию

Нужен ЛИСП по масштабированию

Ответ
Поиск в этой теме
Непрочитано 13.08.2006, 00:52 #1
Нужен ЛИСП по масштабированию
Джин
 
инженер-электрик
 
Москва
Регистрация: 03.10.2005
Сообщений: 19

Доброго времени суток, уважаемые!
Суть просьбы заключается вот в чем:
Выделив несколько одинаковых примитивов на чертеже, задаем одному примитиву точку масштабирования (допустим от центра), а остальные примитивы, могли масштабироваться каждый от своего центра, а не смещались относительно того примитива, на котором была указана точка.
С фигурами, наверное так не получится, но хотя-бы с примитивами...
Просмотров: 7790
 
Непрочитано 13.11.2006, 15:49
#2
Kseon


 
Регистрация: 13.11.2006
Мoscow
Сообщений: 5


Мда, затея неплохая, но скорее всего не реализуемая. Потому как, всё должно быть привязано к одной координате.
Kseon вне форума  
 
Непрочитано 13.11.2006, 15:51
#3
Perezz!!

архитектор
 
Регистрация: 21.08.2003
Москва
Сообщений: 3,587


Было бы здорово. В Максе есть панелька для этого даже заточенная.
Perezz!! вне форума  
 
Непрочитано 13.11.2006, 15:54
#4
X-DeViL

Бизнес-шмизнес
 
Регистрация: 26.05.2004
Питер
Сообщений: 1,911


В максе есть такая штука - гизмо! от нее и пляшет все... а в 2007 каде появились - DUCS... может от этого сплясать попробовать?
X-DeViL вне форума  
 
Непрочитано 13.11.2006, 16:01
#5
Кулик Алексей aka kpblc
Moderator

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


Вообще-то реализуемое (если плясать от центра примитива / солида / фигуры), ЯТД. Вопрос в нужности.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.11.2006, 16:36
#6
Kseon


 
Регистрация: 13.11.2006
Мoscow
Сообщений: 5


Вчера пригнали проект торгового центра, мадам одна делала, на печать вывел, а встроенные светильники на бумаге не "читаются".
Светильник на плане-это кружочек с двумя отрезками внутри круга. Шеф говорит переделай масштаб, это ж не долго.
Ну да, перемасштабировать 350 фигур, по старым координатам установки - сущие пустяки!
Это к вопросу о нужности.
Kseon вне форума  
 
Непрочитано 13.11.2006, 16:52
#7
Кулик Алексей aka kpblc
Moderator

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


А эти несчастные кружки часом не блоки? Потому как я смогу сделать только одно - круг будет масштабироваться вокруг его центра, а вот отрезки - вокруг ИХ центров. Покатит? Или проще будет все же за 2 минуты сделать блок и понавставлять его в нужные точки?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.11.2006, 16:56
1 | #8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Быстро переделал с
http://forum.dwg.ru/showthread.php?p=92287#post92287
Код:
[Выделить все]
(defun c:sm (/ ERRCOUNT MAXPT MINPT MIPT MNPT MXPT 
          OBJSET VLAOBJ PTLST XLST YLST old BASEPT Flg) 
 (vl-load-com)
(if (and (setq VLAOBJ (car(entsel "\nВыберите образец для масштабирования ")))
	 (setq VLAOBJ (vlax-ename->vla-object VLAOBJ))
	 )
  (progn
  (vla-Highlight  VLAOBJ :vlax-true)
  (initget 1)
  (setq BASEPT (getpoint "\nБазовая точка масштабирования: "))
  (vla-GetBoundingBox VLAOBJ 'MinPt 'MaxPt) 
  (setq mnPt(vlax-safearray->list MinPt) 
     mxPt(vlax-safearray->list MaxPt) 
     miPt (polar mnPt (angle mnPt mxPt)(* 0.5 (distance mnPt mxPt))))
  (setq BASEPT (mapcar '- BASEPT miPt))	
  (if(not sm:scale)(setq sm:scale 1))
    (initget 6)	
    (setq old sm:scale 
          sm:scale(getdist 
         (strcat"\nУкажите масштабный коэффициент <"(rtos sm:scale 2 2)">: ")) 
   ); end setq 
  (if(null sm:scale)(setq sm:scale old))
  (vla-Highlight  VLAOBJ :vlax-false)	 
  (setq errCount 0 ptLst 'nil Flg t); en setq
  (while Flg
    (princ "\n§§§ Выберите объекты и нажмите Enter или Esc для выхода. §§§") 
 (if 
   (not(setq objSet(ssget "_I"))) 
   (setq objSet(ssget)) 
   ); end if 
  (if objSet 
    (progn
      (ssadd (vlax-vla-object->ename VLAOBJ) objSet)
      (setq objSet 
       (mapcar 'vlax-ename->vla-object 
                    (vl-remove-if 'listp 
                     (mapcar 'cadr(ssnamex objSet)))))
      (foreach obj objSet 
   (vla-GetBoundingBox obj 'MinPt 'MaxPt) 
    (setq mnPt(vlax-safearray->list MinPt) 
     mxPt(vlax-safearray->list MaxPt) 
     miPt (polar mnPt (angle mnPt mxPt)(* 0.5 (distance mnPt mxPt)))     
     ) 
     (if 
      (vl-catch-all-error-p 
   (vl-catch-all-apply 'vla-ScaleEntity 
     (list obj(vlax-3D-Point (mapcar '+ miPt BASEPT)) sm:scale))) 
      (setq errCount(1+ errCount)) 
      )     
   ); end foreach
   (princ(strcat "\n" (itoa errCount) " объектов на блокированном слое! ")) 
   )
      ); if objset
    (setq Flg nil)
  ); end while
  ))(princ))

Последний раз редактировалось VVA, 24.04.2012 в 22:22.
VVA вне форума  
 
Непрочитано 13.11.2006, 17:14
#9
Kseon


 
Регистрация: 13.11.2006
Мoscow
Сообщений: 5


Цитата:
Сообщение от kpblc
А эти несчастные кружки часом не блоки? Потому как я смогу сделать только одно - круг будет масштабироваться вокруг его центра, а вот отрезки - вокруг ИХ центров. Покатит? Или проще будет все же за 2 минуты сделать блок и понавставлять его в нужные точки?
За две минуты не получится, потому как нужно сначала понавставлять новые по тем же координатам, а потом стереть старые. Прицеливаться, потом по старым довольно долго.
А предложение покатит, это намного лучше, чем вообще ничего.
Kseon вне форума  
 
Непрочитано 13.11.2006, 17:28
#10
Kseon


 
Регистрация: 13.11.2006
Мoscow
Сообщений: 5


Попробовал поставить код от VVA, первый раз программа сработала, при попытке повторно загрузить в командной строке выходит сообщение:
**Команда не разрешена при работе на вкладке модель**
Kseon вне форума  
 
Непрочитано 13.11.2006, 18:07
2 | #11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


>Kseon Это чего-то в Акаде глюкануло. Сколько ни гонял, ни разу такого не выскочило. Там то и команд никаких не используется.
Добавил проверку на наличие метода ScaleEntity
Код:
[Выделить все]
(defun c:sm (/ ERRCOUNT MAXPT MINPT MIPT MNPT MXPT 
          OBJSET VLAOBJ PTLST XLST YLST old BASEPT Flg) 
 (vl-load-com) 
(if (and (setq VLAOBJ (car(entsel "\nВыберите образец для масштабирования "))) 
    (setq VLAOBJ (vlax-ename->vla-object VLAOBJ)) 
    ) 
  (progn 
  (vla-Highlight  VLAOBJ :vlax-true) 
  (initget 1) 
  (setq BASEPT (getpoint "\nБазовая точка масштабирования: ")) 
  (vla-GetBoundingBox VLAOBJ 'MinPt 'MaxPt) 
  (setq mnPt(vlax-safearray->list MinPt) 
     mxPt(vlax-safearray->list MaxPt) 
     miPt (polar mnPt (angle mnPt mxPt)(* 0.5 (distance mnPt mxPt)))) 
  (setq BASEPT (mapcar '- BASEPT miPt))    
  (if(not sm:scale)(setq sm:scale 1)) 
    (initget 6)    
    (setq old sm:scale 
          sm:scale(getdist 
         (strcat"\nУкажите масштабный коэффициент <"(rtos sm:scale 2 2)">: ")) 
   ); end setq 
  (if(null sm:scale)(setq sm:scale old)) 
  (vla-Highlight  VLAOBJ :vlax-false)    
  (setq errCount 0 ptLst 'nil Flg t); en setq 
  (while Flg 
    (princ "\n§§§ Выберите объекты и нажмите Enter или Esc для выхода. §§§") 
 (if 
   (not(setq objSet(ssget "_I"))) 
   (setq objSet(ssget)) 
   ); end if 
  (if objSet 
    (progn 
      (ssadd (vlax-vla-object->ename VLAOBJ) objSet) 
      (setq objSet 
       (mapcar 'vlax-ename->vla-object 
                    (vl-remove-if 'listp 
                     (mapcar 'cadr(ssnamex objSet))))) 
      (foreach obj objSet 
   (vla-GetBoundingBox obj 'MinPt 'MaxPt) 
    (setq mnPt(vlax-safearray->list MinPt) 
     mxPt(vlax-safearray->list MaxPt) 
     miPt (polar mnPt (angle mnPt mxPt)(* 0.5 (distance mnPt mxPt)))      
     )
     (if (vlax-method-applicable-p obj 'ScaleEntity)
     (if 
      (vl-catch-all-error-p 
   (vl-catch-all-apply 'vla-ScaleEntity 
     (list obj(vlax-3D-Point (mapcar '+ miPt BASEPT)) sm:scale))) 
      (setq errCount(1+ errCount)) 
      )
       )
   ); end foreach 
   (princ(strcat "\n" (itoa errCount) " объектов на блокированном слое! ")) 
   ) 
      ); if objset 
    (setq Flg nil) 
  ); end while 
  ))(princ))
VVA вне форума  
 
Непрочитано 17.11.2006, 23:33
#12
Kseon


 
Регистрация: 13.11.2006
Мoscow
Сообщений: 5


Перезагрузил комп, и программа пошла. Видимо действительно был глюк.
Спасибо VVA, всё работает. Кнопочку попозжей сделаю.
Итого классных ЛИСПов, у меня уже набралось шесть.
Kseon вне форума  
 
Автор темы   Непрочитано 17.11.2006, 23:40
#13
Джин

инженер-электрик
 
Регистрация: 03.10.2005
Москва
Сообщений: 19


Респект широченный VVA. Долго ждал, и ... значится не напрасно
Джин вне форума  
 
Непрочитано 04.07.2008, 18:47
#14
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


На эту старую тему дана свежая ссылка, поэтому поднимаю ее
Цитата:
Сообщение от Kseon Посмотреть сообщение
За две минуты не получится, потому как нужно сначала понавставлять новые по тем же координатам, а потом стереть старые. .
Вот аналогия. Из заключения к книге AutoCAD Язык макрокоманд и создание кнопок
Цитата:
Главной задачей является научить пользователя самому строить команды под себя, а также очень быстро, в течение нескольких минут, составить временную команду для выполнения одноразовой рутинной операции.
Как-то к автору обратился сослуживец с просьбой что-нибудь придумать для облегчения его работы. На большом чертеже в разных местах была установлена серия объектов, которую надо было изменить следующим образом: один объект удалить, а находящий здесь же блок с атрибутом перекрасить в другой цвет. То есть предстояло поочередное применение трех команд Erase (Стереть), Eattedit (Атредакт) и Properties (Окносв). Изменить цвет слоя не представлялось возможным. Надо было действовать “One by one”, то есть обрабатывать один объект за другим. Скучная работа. На выполнение операции с одной группой объектов надо было затратить 14 щелчков мыши да еще копаться в диалоговом окне Enchanced Attribute Editor (Редактор атрибутов) и в окошке Color Control (Цвета), подбирая нужный цвет.
Я поставил на одну кнопку команды Erase (Стереть) Attedit ( Атред), наше [3-10] и Change (Изменить), видоизмененная часть нашего [12-11], внес некоторые поправки. Теперь на всю операцию надо было затратить всего три щелчка, если считать первым вызов команды. И заняло это всего 5 минут!
Vova вне форума  
 
Непрочитано 01.06.2015, 09:51
#15
posetitel


 
Регистрация: 16.10.2013
Сообщений: 395


подниму немного тему.
А есть такая программа, которая масштабирует примитивы, как например в "СПДС график" работает панелька масштабов, т.е. не относительно одной определенной точки, а относительно привязанных точек примитива.
posetitel вне форума  
 
Непрочитано 01.06.2015, 10:23
#16
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Команда "_objectscale"
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 01.06.2015, 10:31
#17
posetitel


 
Регистрация: 16.10.2013
Сообщений: 395


не работает на примитивах, пишет, что отсутствуют "аннотативные" объекты
чтобы было понятнее, хочу увеличивать объекты СПДС extension.
posetitel вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен ЛИСП по масштабированию