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

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

Лисп по масштабированию объектов.

Ответ
Поиск в этой теме
Непрочитано 05.08.2015, 14:27 #1
Лисп по масштабированию объектов.
posetitel
 
Регистрация: 16.10.2013
Сообщений: 395

Добрый день.
Был лисп от Крыса по масштабированию выделенных размеров и блоков
Цитата:
Вставлю-ка и я свои тугрики сюдэма. Насчет большого количества имен стилей - так поступает, например, ADT, что лично я не считаю правильным. Дело в том, что изменение dimscale для выбранных размеров моментально поменяет их. Например, такой лисп:
Код:
Код:
[Выделить все]
;|=============================================================================
*    Установка масштаба. Для хранения масштаба используется переменная USERR1
* Я понимаю, что этот вариант не есть хорошо, в последующем данные будут храниться
* в свойствах чертежа (когда окончательно пойму, какой должна быть структура и
* каким образом в таком случае автоматически менять modemacro).
* Для пространства модели устанавливаются значения dimscale, celtscale, hpscale,
* hpspace равными значению параметров. Для пространства листа = 1.
*    Попутно задается значение USERR1. Устанавливаемое значение UserR1 не зависит
* от активного пространства.
*    Также устанавливается значение modemacro.
*    Параметры вызова:
*	scale-factor	- Значение масштаба. scale-factor> 1 => M1:<scale-factor>
*			  scale-factor < 1 => M<scale-factor>:1
*			  Чтение масштаба производится отдельной функцией.
*    Примеры вызова:
(kpblc-set-scale 100)	; установить масштаб 1:100
(kpblc-set-scale 1)	; установить масштаб 1:1
(kpblc-set-scale 0.5)	; установить масштаб 2:1
=============================================================================|;
(defun kpblc-set-scale
       (scale-factor / _scale_ selset counter item_layer layer_list)
  (if (_kpblc-get-active-space)
    (setq _scale_ scale-factor)
    (setq _scale_ 1)
    ) ;_ end of if
  (setq counter 0)
  (mapcar 'setvar
          (list "userr1" "dimscale" "celtscale" "hpscale" "hpspace" "ltscale")
          (list scale-factor _scale_ _scale_ _scale_ _scale_ 1)
          ) ;_ end of mapcar
  (setvar
    "modemacro"
    "\"Масштаб 1:\"$(if,$(eq,$(getvar,\"cvport\"),1),\"1 (лист)\",$(rtos,$(getvar,\"userr1\"),2))"
    ) ;_ end of setvar
  (if (setq selset (ssget "_I"))
    (while (setq item (ssname selset counter))
      (setq counter (1+ counter)
            item    (vlax-ename->vla-object item)
            ) ;_ end of setq
      (setq item_layer (vlax-ename->vla-object
                         (tblobjname "layer" (vla-get-layer item))
                         ) ;_ end of vlax-ename->vla-object
            layer_list (list
                         (cons "lock" (vla-get-lock item_layer))
                         ) ;_ end of list
            ) ;_ end of setq
      (vla-put-lock item_layer :vlax-false)
      (if (vlax-property-available-p item 'scalefactor t)
        (vla-put-scalefactor item _scale_)
        ) ;_ end of if
      ;;(if (vlax-property-available-p item 'linetypescale t)
        (vla-put-linetypescale item _scale_)
      ;;  ) ;_ end of if
      (if (vlax-property-available-p item 'xscalefactor t)
        (progn
          (vla-put-xscalefactor item _scale_)
          (vla-put-yscalefactor item _scale_)
          (vla-put-zscalefactor item _scale_)
          ) ;_ end of progn
        ) ;_ end of if
      (vla-put-lock item_layer (cdr (assoc "lock" layer_list)))
      ) ;_ end of while
    ) ;_ end of if
  (vla-regen *kpblc-activedoc* acallviewports)
  (princ)
  ) ;_ end of defun
;|=============================================================================
*    Функция возвращает активное пространство (лист / модель). Для листа
* возвращается nil. Для модели - T
*    Параметры вызова:
*	Нет
*    Примеры вызова:
(_kpblc-get-active-space)
=============================================================================|;
(defun _kpblc-get-active-space ()
  (or (= (getvar "tilemode") 1)
      (/= (getvar "cvport") 1)
      ) ;_ end of or
  ) ;_ end of defun
меняет для выбранных объектов celtscale, dimscale, hpscale, hpspace и заодно масштабирует блоки. Тексты и многострочные тексты не обрабатываются из-за моего незнания.
может кто знает, как переделать данный лисп, чтобы блоки не масштабировались, а масштабировались толко размеры, штриховка и объекты спдс-extension из слоев "размеры", "штриховка", "дополнительно"
или как минимум, чего надо удалить, чтобы блоки не масштабировались

Последний раз редактировалось posetitel, 05.08.2015 в 14:48.
Просмотров: 2364
 
Непрочитано 05.08.2015, 17:00
#2
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Цитата:
Сообщение от posetitel Посмотреть сообщение
как переделать данный лисп, чтобы блоки не масштабировались,
Заменить (setq selset (ssget "_I") на (ssget "_I" '((-4 . "<NOT")(0. "INSERT")(-4 . "NOT>")))
roaa вне форума  
 
Автор темы   Непрочитано 05.08.2015, 17:13
#3
posetitel


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


пишет
; ошибка: неверный список SSGET
posetitel вне форума  
 
Непрочитано 05.08.2015, 17:20
#4
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Цитата:
Сообщение от posetitel Посмотреть сообщение
; ошибка: неверный список SSGET
аргумент "_I" для выделенных уже объектов. Сначала выделите, а потом уж и запускайте команду

----- добавлено через ~2 мин. -----
или, не меняя кода программы, перед ее запуском запустите команду (выбор рамкой): (ssget "_W" '((-4 . "<NOT")(0. "INSERT")(-4 . "NOT>")))
roaa вне форума  
 
Автор темы   Непрочитано 06.08.2015, 09:18
#5
posetitel


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


так выделял, все тоже самое.
на всякий случай прилагаю что получилось при замене
Код:
[Выделить все]
;|=============================================================================
*    Установка масштаба. Для хранения масштаба используется переменная USERR1
* Я понимаю, что этот вариант не есть хорошо, в последующем данные будут храниться
* в свойствах чертежа (когда окончательно пойму, какой должна быть структура и
* каким образом в таком случае автоматически менять modemacro).
* Для пространства модели устанавливаются значения dimscale, celtscale, hpscale,
* hpspace равными значению параметров. Для пространства листа = 1.
*    Попутно задается значение USERR1. Устанавливаемое значение UserR1 не зависит
* от активного пространства.
*    Также устанавливается значение modemacro.
*    Параметры вызова:
*	scale-factor	- Значение масштаба. scale-factor> 1 => M1:<scale-factor>
*			  scale-factor < 1 => M<scale-factor>:1
*			  Чтение масштаба производится отдельной функцией.
*    Примеры вызова:
(kpblc-set-scale 100)	; установить масштаб 1:100
(kpblc-set-scale 1)	; установить масштаб 1:1
(kpblc-set-scale 0.5)	; установить масштаб 2:1
=============================================================================|;
(defun kpblc-set-scale
       (scale-factor / _scale_ selset counter item_layer layer_list)
  (if (_kpblc-get-active-space)
    (setq _scale_ scale-factor)
    (setq _scale_ 1)
    ) ;_ end of if
  (setq counter 0)
  (mapcar 'setvar
          (list "userr1" "dimscale" "celtscale" "hpscale" "hpspace" "ltscale")
          (list scale-factor _scale_ _scale_ _scale_ _scale_ 1)
          ) ;_ end of mapcar
  (setvar
    "modemacro"
    "\"Масштаб 1:\"$(if,$(eq,$(getvar,\"cvport\"),1),\"1 (лист)\",$(rtos,$(getvar,\"userr1\"),2))"
    ) ;_ end of setvar
  (if (ssget "_I" '((-4 . "<NOT")(0. "INSERT")(-4 . "NOT>")))
    (while (setq item (ssname selset counter))
      (setq counter (1+ counter)
            item    (vlax-ename->vla-object item)
            ) ;_ end of setq
      (setq item_layer (vlax-ename->vla-object
                         (tblobjname "layer" (vla-get-layer item))
                         ) ;_ end of vlax-ename->vla-object
            layer_list (list
                         (cons "lock" (vla-get-lock item_layer))
                         ) ;_ end of list
            ) ;_ end of setq
      (vla-put-lock item_layer :vlax-false)
      (if (vlax-property-available-p item 'scalefactor t)
        (vla-put-scalefactor item _scale_)
        ) ;_ end of if
      ;;(if (vlax-property-available-p item 'linetypescale t)
        (vla-put-linetypescale item _scale_)
      ;;  ) ;_ end of if
      (if (vlax-property-available-p item 'xscalefactor t)
        (progn
          (vla-put-xscalefactor item _scale_)
          (vla-put-yscalefactor item _scale_)
          (vla-put-zscalefactor item _scale_)
          ) ;_ end of progn
        ) ;_ end of if
      (vla-put-lock item_layer (cdr (assoc "lock" layer_list)))
      ) ;_ end of while
    ) ;_ end of if
  (vla-regen *kpblc-activedoc* acallviewports)
  (princ)
  ) ;_ end of defun
;|=============================================================================
*    Функция возвращает активное пространство (лист / модель). Для листа
* возвращается nil. Для модели - T
*    Параметры вызова:
*	Нет
*    Примеры вызова:
(_kpblc-get-active-space)
=============================================================================|;
(defun _kpblc-get-active-space ()
  (or (= (getvar "tilemode") 1)
      (/= (getvar "cvport") 1)
      ) ;_ end of or
  ) ;_ end of defun
posetitel вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Лисп по масштабированию объектов.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Autolisp выделение объектов DENBASS2004 LISP 6 07.07.2015 11:25
Нужен ЛИСП по масштабированию Джин LISP 16 01.06.2015 10:31
Нужен Лисп: программный EXPLODE выделенных объектов Кочетков Андрей LISP 25 06.08.2009 12:35
FILTER / фильтр BM60 Справочник команд 0 08.07.2008 15:35
Лисп для копирования данных нескольких мтекстов по принципу расположения. Red Nova LISP 14 18.06.2008 22:08