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

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

Установка параметра видимости в блоке случайным образом

Ответ
Поиск в этой теме
Непрочитано 25.12.2010, 14:48 #1
Установка параметра видимости в блоке случайным образом
Volodich
 
проектировщик-электрик
 
Челябинск
Регистрация: 20.12.2007
Сообщений: 474

Всех приветствую!
Сделал на работе подпись, вырисованную в автокаде, причем вырисовал несколько вариантов. И возникла задача.
Исходные условия:
1. Все чертежи выполнены в модели и в каждом чертеже есть блок "подпись".
2. В блоке подпись есть несколько видимостей "Вариант1", "Вариант2" и т.д.
И возникла мысль - можно ли написать лиспик такого содержания:
3. Запускаешь программу и она в каждом блоке случайным образом выбирает видимость.
4. Все
5. Хотелось бы чтобы нетрудно было в программу самостоятельно забивать название блока. Или еще лучше - щелкать по нему мышкой при запуске программы.

Понятно дело, что все подписи электронные и все это видно, но если они будут различаться, это будет приятнее.

Чтобы не мучиться с блоком, он прилагается. (надо только его раскопировать по чертежу для проверки).

Добавлено: З.Ы. Если такое уже вдруг есть, просто ткните носом, пожалуйста!

Вложения
Тип файла: dwg
DWG 2007
Подпись.dwg (81.0 Кб, 616 просмотров)

__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...

Последний раз редактировалось Volodich, 14.01.2011 в 14:44.
Просмотров: 4919
 
Непрочитано 27.12.2010, 19:47
1 | #2
Uduzr

проектирование электроснабжения
 
Регистрация: 17.03.2009
Екатеринбург
Сообщений: 44


Если я правильно понял то вот:
Код:
[Выделить все]
  
(vl-load-com)
  (setq acad_application (vlax-get-acad-object))
  (setq active_document (vla-get-ActiveDocument acad_application))
  (setq model_space (vla-get-ModelSpace active_document))
  (setq paper_space (vla-get-PaperSpace active_document))
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * _dwgru-random
;;; *
;;;  На основе vk_RandNum
;;;  http://www.autocad.ru/cgi-bin/f1/board.cgi?t=32692Wn
;;; *
;;; *
;;; * 07/12/2007 Версия 0001.  Редакция Владимир Азарко (VVA)
;;; ************************************************************************
(defun _dwgru-random (/ modulus multiplier increment)
;;; Генерирует случайное вещественное число в диапазоне от 0 до 1
;;; Используется глобальная переменная *DWGRU_SEED*
  (if (not *DWGRU_SEED*)
    (setq *DWGRU_SEED* (getvar "DATE"))
  )
  (setq  modulus     65536
  multiplier 25173
  increment  13849
  *DWGRU_SEED*     (rem (+ (* multiplier *DWGRU_SEED*) increment) modulus))
  (/ *DWGRU_SEED* modulus)
)
;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * dwgru-random-range
;;; *
;;; * 07/12/2007 Версия 0001.  Редакция Владимир Азарко (VVA)
;;; ************************************************************************
(defun dwgru-random-range (Minnum Maxnum )
;;; Генерирует случайное число из указанного диапазона целых чисел
;;; Использует функцию библиотеки
    ;;;                 _dwgru-random
    ;;; Параметры: 
    ;;; Minnum - минимальное целое число
    ;;; Maxnum - максимальное целое число
    ;;; Возврат:
    ;;;   целое число из указанного диапазона
 
    ;;; Пример:
  ;|
  (DWGRU-NUM-RANDOM-RANGE 1 15) ;_Результат 3
  (DWGRU-NUM-RANDOM-RANGE 1 15) ;_Результат 10
  |;
;(- Maxnum (atoi (rtos (* (- Maxnum Minnum) (_dwgru-num-random)) 2 0))) ;_Comment VVA 07.12.2007 Было так
(- Maxnum (fix (* (- Maxnum Minnum) (_dwgru-random)))) ;_Add VVA 07.12.2007 Так наверное быстрее
)
(setq sel (ssget "x" (list (cons '0 '"Insert"))) i 0)
(setq dlinanabora (sslength sel))
(while (< i dlinanabora)
	(setq object (vlax-ename->vla-object (ssname sel i)))
	(setq temp (vla-getdynamicBlockProperties object))
	(setq object (car (vlax-safearray->list (vlax-variant-value temp))))
	(setq nabori (vlax-safearray->list (vlax-variant-value (vla-get-allowedvalues object))))
  	(setq dlina (length nabori))
	(setq y (dwgru-random-range -1 (- dlina 1) ))
  	(vla-put-value object (nth y nabori))
  	(setq i (1+ i))
);end while
Генератор случайных чисел не мой, постарался коментарии сохранить. Надо будет на досуге подумать над своим ГСЧ.. Первый раз он понадобился честно говоря.
Uduzr вне форума  
 
Автор темы   Непрочитано 30.12.2010, 12:59
#3
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 474


Спасибо, Uduzr!
Только теперь объясни, пожалуйста, простым смертным, а как это запускать?
Обычно в лиспах стоит в начале строчка типа "(defun _podpis ...", я эту функцию и использую, а тут я увидел функцию для генерации случайных чисел, но не увидел функции, которую я описывал в 1м посте...
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 30.12.2010, 14:52
#4
Uduzr

проектирование электроснабжения
 
Регистрация: 17.03.2009
Екатеринбург
Сообщений: 44


Дык вот ведь все же знаете )) после ГСЧ добавить
Код:
[Выделить все]
(defun podpisi ()
и в конце ))) все просто )))
чтоб не маятся привожу итоговый текст, вызывается
Код:
Код:
[Выделить все]
  (vl-load-com)
  (setq acad_application (vlax-get-acad-object))
  (setq active_document (vla-get-ActiveDocument acad_application))
  (setq model_space (vla-get-ModelSpace active_document))
  (setq paper_space (vla-get-PaperSpace active_document))
;;; * Áèáëèîòåêà DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * _dwgru-random
;;; *
;;;  Íà îñíîâå vk_RandNum
;;;  http://www.autocad.ru/cgi-bin/f1/board.cgi?t=32692Wn
;;; *
;;; *
;;; * 07/12/2007 Âåðñèÿ 0001.  Ðåäàêöèÿ Âëàäèìèð Àçàðêî (VVA)
;;; ************************************************************************
(defun _dwgru-random (/ modulus multiplier increment)
;;; Ãåíåðèðóåò ñëó÷àéíîå âåùåñòâåííîå ÷èñëî â äèàïàçîíå îò 0 äî 1
;;; Èñïîëüçóåòñÿ ãëîáàëüíàÿ ïåðåìåííàÿ *DWGRU_SEED*
  (if (not *DWGRU_SEED*)
    (setq *DWGRU_SEED* (getvar "DATE"))
  )
  (setq  modulus     65536
  multiplier 25173
  increment  13849
  *DWGRU_SEED*     (rem (+ (* multiplier *DWGRU_SEED*) increment) modulus))
  (/ *DWGRU_SEED* modulus)
)
;;; ************************************************************************
;;; * Áèáëèîòåêà DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * dwgru-random-range
;;; *
;;; * 07/12/2007 Âåðñèÿ 0001.  Ðåäàêöèÿ Âëàäèìèð Àçàðêî (VVA)
;;; ************************************************************************
(defun dwgru-random-range (Minnum Maxnum )
;;; Ãåíåðèðóåò ñëó÷àéíîå ÷èñëî èç óêàçàííîãî äèàïàçîíà öåëûõ ÷èñåë
;;; Èñïîëüçóåò ôóíêöèþ áèáëèîòåêè
    ;;;                 _dwgru-random
    ;;; Ïàðàìåòðû: 
    ;;; Minnum - ìèíèìàëüíîå öåëîå ÷èñëî
    ;;; Maxnum - ìàêñèìàëüíîå öåëîå ÷èñëî
    ;;; Âîçâðàò:
    ;;;   öåëîå ÷èñëî èç óêàçàííîãî äèàïàçîíà
 
    ;;; Ïðèìåð:
  ;|
  (DWGRU-NUM-RANDOM-RANGE 1 15) ;_Ðåçóëüòàò 3
  (DWGRU-NUM-RANDOM-RANGE 1 15) ;_Ðåçóëüòàò 10
  |;
;(- Maxnum (atoi (rtos (* (- Maxnum Minnum) (_dwgru-num-random)) 2 0))) ;_Comment VVA 07.12.2007 Áûëî òàê
(- Maxnum (fix (* (- Maxnum Minnum) (_dwgru-random)))) ;_Add VVA 07.12.2007 Òàê íàâåðíîå áûñòðåå
)
(defun podpisi ()
(setq sel (ssget "x" (list (cons '0 '"Insert"))) i 0)
(setq dlinanabora (sslength sel))
(while (< i dlinanabora)
	(setq object (vlax-ename->vla-object (ssname sel i)))
	(setq temp (vla-getdynamicBlockProperties object))
	(setq object (car (vlax-safearray->list (vlax-variant-value temp))))
	(setq nabori (vlax-safearray->list (vlax-variant-value (vla-get-allowedvalues object))))
  	(setq dlina (length nabori))
	(setq y (dwgru-random-range -1 (- dlina 1) ))
  	(vla-put-value object (nth y nabori))
  	(setq i (1+ i))
);end while
)
Ну а исходный вариант я просто из редактора запускал..
Uduzr вне форума  
 
Автор темы   Непрочитано 12.01.2011, 12:41
#5
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 474


Действительно! Уже ближе!
Работает, но только когда в файле один блок. Точнее вхождений может быть несколько, но блок один. Тогда работает корректно.
А если вставить в чертеж еще, например, несколько вхождений другого блока, у которого тоже есть параметр видимости, то при запуске функции podpisi второй блок тоже видоизменится случайным образом.
Возможно ли эту программку переделать так, чтобы она случайным образом меняла видимость только выбранного (тыкнутого мышкой при запуске функции) блока?
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 12.01.2011, 18:13
#6
Uduzr

проектирование электроснабжения
 
Регистрация: 17.03.2009
Екатеринбург
Сообщений: 44


Как то я не подумал о других блоках доработать легко, попробуйте этот вариант. Запуск функции тот же, при запуске просит указать (ткнуть мышью) вхождение блока видимость которого надо "перемешать"...
Код:
[Выделить все]
 (vl-load-com)
  (setq acad_application (vlax-get-acad-object))
  (setq active_document (vla-get-ActiveDocument acad_application))
  (setq model_space (vla-get-ModelSpace active_document))
  (setq paper_space (vla-get-PaperSpace active_document))
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * _dwgru-random
;;; *
;;;  На основе vk_RandNum
;;;  http://www.autocad.ru/cgi-bin/f1/board.cgi?t=32692Wn
;;; *
;;; *
;;; * 07/12/2007 Версия 0001.  Редакция Владимир Азарко (VVA)
;;; ************************************************************************
(defun _dwgru-random (/ modulus multiplier increment)
;;; Генерирует случайное вещественное число в диапазоне от 0 до 1
;;; Используется глобальная переменная *DWGRU_SEED*
  (if (not *DWGRU_SEED*)
    (setq *DWGRU_SEED* (getvar "DATE"))
  )
  (setq  modulus     65536
  multiplier 25173
  increment  13849
  *DWGRU_SEED*     (rem (+ (* multiplier *DWGRU_SEED*) increment) modulus))
  (/ *DWGRU_SEED* modulus)
)
;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * dwgru-random-range
;;; *
;;; * 07/12/2007 Версия 0001.  Редакция Владимир Азарко (VVA)
;;; ************************************************************************
(defun dwgru-random-range (Minnum Maxnum )
;;; Генерирует случайное число из указанного диапазона целых чисел
;;; Использует функцию библиотеки
    ;;;                 _dwgru-random
    ;;; Параметры: 
    ;;; Minnum - минимальное целое число
    ;;; Maxnum - максимальное целое число
    ;;; Возврат:
    ;;;   целое число из указанного диапазона
 
    ;;; Пример:
  ;|
  (DWGRU-NUM-RANDOM-RANGE 1 15) ;_Результат 3
  (DWGRU-NUM-RANDOM-RANGE 1 15) ;_Результат 10
  |;
;(- Maxnum (atoi (rtos (* (- Maxnum Minnum) (_dwgru-num-random)) 2 0))) ;_Comment VVA 07.12.2007 Было так
(- Maxnum (fix (* (- Maxnum Minnum) (_dwgru-random)))) ;_Add VVA 07.12.2007 Так наверное быстрее
)
(defun podpisi ()
  (setq obj (vlax-ename->vla-object (car (entsel "выберите вхождение блока состояние видимости которого требуется сделать произвольным"))))
  (setq name (vla-get-effectivename obj))
(setq sel (ssget "x" (list (cons '0 '"Insert"))) i 0)
(setq dlinanabora (sslength sel))
(while (< i dlinanabora)
     	(setq object (vlax-ename->vla-object (ssname sel i)))
    (if (= (vla-get-effectivename object) name)
     (progn
  	(setq temp (vla-getdynamicBlockProperties object))
	(setq object (car (vlax-safearray->list (vlax-variant-value temp))))
	(setq nabori (vlax-safearray->list (vlax-variant-value (vla-get-allowedvalues object))))
  	(setq dlina (length nabori))
	(setq y (dwgru-random-range -1 (- dlina 1) ))
  	(vla-put-value object (nth y nabori))
     );end progn
    );end if
  	(setq i (1+ i))
);end while
)
Uduzr вне форума  
 
Автор темы   Непрочитано 13.01.2011, 07:28
#7
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 474


Uduzr, оно!
СПАСИБО!

P.S. я тут подумал, возможно эта программка может пригодиться, например, архитекторам, которые расставят по чертежу, допустим, машины (одним блоком) и с одного нажатия сделают эти машины разными.

P.P.S. Если администратор посчитает нужным, предлагаю тему переименовать в более понятную для поиска (что-то вроде - "установка параметра видимости в блоке случайным образом" - ну или на свое усмотрение).
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 13.01.2011, 10:45
#8
Do$

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


Цитата:
Сообщение от Volodich Посмотреть сообщение
P.P.S. Если администратор посчитает нужным, предлагаю тему переименовать в более понятную для поиска (что-то вроде - "установка параметра видимости в блоке случайным образом" - ну или на свое усмотрение).
Offtop: Мысль хорошая, вот только зачем администраторов напрягать? Автор темы может сам ее переименовать.
Do$ вне форума  
 
Автор темы   Непрочитано 14.01.2011, 07:10
#9
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 474


Цитата:
Сообщение от Do$ Посмотреть сообщение
Offtop: Мысль хорошая, вот только зачем администраторов напрягать? Автор темы может сам ее переименовать.
Тогда извиняюсь. Я что-то копался копался и не нашел где тема меняется, поэтому обратился к администраторам. Сейчас покопаюсь еще получше. Спасибо за совет.
---
Покопался... Нашел только "опции темы", а там нет "переименовать". Подскажете, пожалуйста, где это делается?
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Непрочитано 14.01.2011, 08:16
#10
Лиспер


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


Как переименовать тему?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 14.01.2011, 14:46
#11
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 474


Лиспер, Спасибо!
Благодарю всех за помощь!
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
 
Автор темы   Непрочитано 01.02.2023, 09:20
#12
Volodich

проектировщик-электрик
 
Регистрация: 20.12.2007
Челябинск
Сообщений: 474


Прошло почти 12 лет... Программка пригодилась! Расставлял разноцветные плитки на стене в ванной (плитки сделал блоком с видимостью в разных цветах), прикольно работает!
__________________
Неважно, что что-то идет неправильно. Возможно, это хорошо выглядит...
Volodich вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Установка параметра видимости в блоке случайным образом

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

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