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

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

Команда наподобие массива

Ответ
Поиск в этой теме
Непрочитано 23.11.2011, 11:55 #1
Команда наподобие массива
Seryj_Wolk
 
Инженер-электрик
 
Псков
Регистрация: 04.03.2008
Сообщений: 59

Помогите пожалуйста. Очень часто возникает задача расстановки объектов на какой-то площади прямоугольной формы. Условия расстановки следующие. Первый и последний объекты устанавливаются на расстоянии L/2n от края площади. Расстояния между остальными объектами L/n. Где L - длина стороны по которой производится расстановка объектов, а n количество участков разбиения. Хотелось бы видеть примерно следующий алгоритм команды.
1. Выберите объект (за точку копирования принимается середина объекта или точка блока за который его тягают (не знаю как называется).
2. Выберите длину ряда.
3. Выберите высоту столбца.
4. Укажите количество объектов в строке.
5. Укажите количество объектов в столбце.
Или хотя бы в упрощенном виде. Такие же разбиения вдоль одной линии, а не в виде массива.
Просмотров: 4504
 
Непрочитано 23.11.2011, 12:17
#2
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Светильники?
посмотри zcad http://forum.dwg.ru/showthread.php?t=8707. есть расстановка блоков как тебе нужно или по общему количеству + автоповорот вставляемых блоков. работает отдельно от автокада с dxf файлами.

зы. на правах рекламы))
Миниатюры
Нажмите на изображение для увеличения
Название: screen1.PNG
Просмотров: 99
Размер:	21.2 Кб
ID:	70109  
zamtmn вне форума  
 
Автор темы   Непрочитано 23.11.2011, 13:06
#3
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


Да, именно светильники. Но работаю я в Автокаде, куча наработок уже там и что-то дополнительно устанавливать не хотелось бы. Можно же такую функцию реализовать в Атокаде. Я хоть и не сильно разбираюсь в програмировании и Лиспе, но мне кажется слишком сложного нет ничего
Seryj_Wolk вне форума  
 
Непрочитано 23.11.2011, 23:16
#4
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Распаковать,ьзатащить в модель, ob2rc
Вложения
Тип файла: zip ob2rc.zip (1.3 Кб, 51 просмотров)
Victor вне форума  
 
Непрочитано 24.11.2011, 00:04
#5
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Можешь взять за основу
Код:
[Выделить все]
  (defun C:Lig (/  *error* bk dx dy leg m n osm p1 p2 p3 p4 pmin pn px py req wid)
(defun *error*	(msg)
  (cond
    (or
     (not msg)
     (member msg
	     (list "console break"
		   "Function cancelled"
		   "quit / exit abort"))
     )
    )
 (if msg (princ (strcat "\nError: " msg))
   )
(command "_undo" "end")
(command "_ucs" "_p")
(setvar 'cmdecho 1)
(setvar 'attdia 1)
(setvar 'qaflags 0)
(if req (setvar 'attreq req))
(if osm (setvar 'osmode osm)) 
  (princ)
  )


  (defun 3dPoint->2dPoint	(3dpt)
  (list (float (car 3dpt)) (float (cadr 3dpt)))
);end of 3dPoint->2dPoint

(command "_.undo" "_begin")
(setvar 'cmdecho 0)
(command "_.ucs" "_w")
(setq osm  (getvar 'osmode))
(setq req (getvar 'attreq))
(setq p1 (getpoint "\nПервая точка: "))
(setq p3 (getcorner p1 "\nПротивоположная точка: "))
(setq p1  (3dPoint->2dPoint p1)
      p3  (3dPoint->2dPoint p3)
      p2  (list (car p3) (cadr p1))
      p4  (list (car p1) (cadr p3))
      leg (distance p1 p2)
      wid (distance p1 p4)
      )
  (command "_.zoom" p1 p3)

(setq m (getint "\n Количество рядов: " )
      n (getint "\n Количество столбцов: " )
      dx (/ leg n 2. )
      dy dx
      leg (- leg (* dx 2.))
      wid (- wid (* dy 2.))
      )
(setq px (apply 'min (mapcar 'car (list p1 p2 p3 p4)))
      py(apply 'min (mapcar 'cadr (list p1 p2 p3 p4)))
      pn (list px py)
      pmin (car (vl-remove-if-not
		  (function (lambda(a)
			      (and (equal (car a)(car pn)0.001)
				   (equal (cadr a)(cadr pn)0.001)))
			    )  (list p1 p2 p3 p4))
		)
      px (+ px dx)
      py (+ py dy)
      )
 (setq pmin (list px py))

(setvar 'attdia 0)
(setvar 'attreq 0)
(setvar 'osmode 0)
(setvar 'qaflags 1)
(command "_.-insert" "svet" (trans pmin 1 0) "1.0"  "0.0")
(setvar 'qaflags 0)
(setq bk (entlast))
  (terpri)
  (setq rows (itoa m)
	cols (itoa n))
(vl-cmdf "_.-array" bk "" "_R" m n (/ wid (1- m)) (/ leg (1- n)) )

(*error* nil)
(princ)
)

Последний раз редактировалось Олег (jr.), 30.11.2011 в 11:03. Причина: лоханулся с *error*
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 24.11.2011, 13:00
#6
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


Спасибо за ответ. Только я не силен в программировании. Это что за программка, именно как я просил или чем то отличается?? Можно в двух словах описать?
Seryj_Wolk вне форума  
 
Непрочитано 24.11.2011, 16:34
#7
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


замени в коде имя блока - я от балды ипользовал имя "svet"
загрузи код и в командной строке набери: lig или LIG без разницы
дальше смотри подсказки в клмандной строке
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 28.11.2011, 16:23
#8
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


Что-то не получается ничего.
Плюс ко всему эта программа сбрасывает настройки привязок

Неизвестная команда "-INSERT". Для вызова справки нажмите F1.
Неизвестная команда "ARS 418". Для вызова справки нажмите F1.
Неизвестная команда "1.0". Для вызова справки нажмите F1.
Неизвестная команда "0.0". Для вызова справки нажмите F1.
Неизвестная команда "-ARRAY". Для вызова справки нажмите F1.
<имя объекта: 7EFCC158>
Seryj_Wolk вне форума  
 
Непрочитано 28.11.2011, 22:23
#9
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811



Я тестировал в 2009-м (аглицкий)
все работает
забыл только в начале вызвать загрузку VLLIB.DLL
Код:
вставь сам
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 29.11.2011, 11:07
#10
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


Почти тоже самое. У меня 2007. Может по этому не работает?

Команда: lig
Первая точка:
Противоположная точка:
Количество рядов: 3
Количество столбцов: 5
Неизвестная команда "-INSERT". Для вызова справки нажмите F1.
Неизвестная команда "ARS 418". Для вызова справки нажмите F1.
Неверное определение рамки.
Error: Функция отменена
Неверное определение рамки.
; ошибка: В функции *error* возникла ошибка:Функция отменена
Seryj_Wolk вне форума  
 
Непрочитано 29.11.2011, 11:14
#11
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Seryj_Wolk Посмотреть сообщение
Почти тоже самое. У меня 2007. Может по этому не работает?

Команда: lig
Первая точка:
Противоположная точка:
Количество рядов: 3
Количество столбцов: 5
Неизвестная команда "-INSERT". Для вызова справки нажмите F1.
Неизвестная команда "ARS 418". Для вызова справки нажмите F1.
Неверное определение рамки.
Error: Функция отменена
Неверное определение рамки.
; ошибка: В функции *error* возникла ошибка:Функция отменена
Видимо, потому что у Вас ACAD локализованный, а у Олег (jr.), как он сам сказал,
Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Я тестировал в 2009-м (аглицкий)
так что напиши вместо -insert _-insert, вместо -array _-array
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 30.11.2011, 08:59
#12
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


Изменения есть. НО.
По прежнему сбрасывает привязки.
Ставит только один блок на расстоянии по оси Х L/2n. L - длина по оси Х. n - количество разбиений по оси Х. По оси Y откладывается такое же расстояние

Команда: lig
Первая точка:
Противоположная точка:
Количество рядов: 5
Количество столбцов: 3
Значение должно быть ненулевым.
Error: Функция отменена
Требуется численное значение.
; ошибка: В функции *error* возникла ошибка:Функция отменена
Масштаб по оси Y <равен масштабу по X>:
Угол поворота <0>:
Seryj_Wolk вне форума  
 
Непрочитано 30.11.2011, 11:05
#13
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Исправил функцию *error* в посте #5
Пробуй по-новой
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 30.11.2011, 13:30
#14
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


Без изменений

Команда: lig
_.undo Текущие настройки: Авто = Вкл, Управление = Все, Объединить = Есть
Количество отменяемых операций или [Авто/Управление/Начало/Конец/Метка/Обратно]
<1>: _begin
Команда:
Первая точка: >>
Первая точка:
Противоположная точка:
Количество рядов: 5
Количество столбцов: 3
Значение должно быть ненулевым.
Error: Функция отменена
Требуется численное значение.
; ошибка: В функции *error* возникла ошибка:Функция отменена
Масштаб по оси Y <равен масштабу по X>:
Угол поворота <0d0'>:
Seryj_Wolk вне форума  
 
Непрочитано 30.11.2011, 15:06
#15
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


У меня все работает, вот пробуй еще (это последняя моя попытка)
дальше ковыряй свои баги сам, измени имя блока
Для теста запусти с консоли как есть:

Код:
[Выделить все]
 (vl-load-com)
(defun C:Lig (/  *error* bname bk cols dx dy leg m n or osm p1 p2 p3 p4 pmin pn px py req rows wid)
   
(defun *error*	(msg)
  (cond
    (or
     (not msg)
     (member msg
	     (list "console break"
		   "Function cancelled"
		   "quit / exit abort"))
     )
    )
 (if msg (princ (strcat "\nError: " msg))
   )
(command "_undo" "end")
(command "_ucs" "_p")
(setvar 'cmdecho 1)
(setvar 'attdia 1)
(setvar 'qaflags 0)
(if req (setvar 'attreq req))
(if osm (setvar 'osmode osm)) 
  (princ)
  )


  (defun 3dPoint->2dPoint	(3dpt)
  (list (float (car 3dpt)) (float (cadr 3dpt)))
);end of 3dPoint->2dPoint

;;	======================= Имя твоего блока укажи здесь: ==============================	;;
 (setq bname "svet") ;<-- !
;;	====================================================================================	;;
   (if (not (tblsearch "block" bname))
     (alert (strcat  "Блок " "\"" bname "\"" " не существует. Отмена команды"))
   (progn
     (command "_.undo" "_begin")
(setvar 'cmdecho 0)
(command "_.ucs" "_w")
(setq osm  (getvar 'osmode))
(setq req (getvar 'attreq))
(setq p1 (getpoint "\nПервая точка: "))
(setq p3 (getcorner p1 "\nПротивоположная точка: "))
(setq p1  (3dPoint->2dPoint p1)
      p3  (3dPoint->2dPoint p3)
      p2  (list (car p3) (cadr p1))
      p4  (list (car p1) (cadr p3))
      leg (distance p1 p2)
      wid (distance p1 p4)
      )
  (command "_.zoom" p1 p3)

(setq m (getint "\n Количество рядов: " )
      n (getint "\n Количество столбцов: " )
      dx (/ leg n 2. )
      dy dx
      leg (- leg (* dx 2.))
      wid (- wid (* dy 2.))
      )
(setq px (apply 'min (mapcar 'car (list p1 p2 p3 p4)))
      py(apply 'min (mapcar 'cadr (list p1 p2 p3 p4)))
      pn (list px py)
      pmin (car (vl-remove-if-not
		  (function (lambda(a)
			      (and (equal (car a)(car pn)0.001)
				   (equal (cadr a)(cadr pn)0.001)))
			    )  (list p1 p2 p3 p4))
		)
      px (+ px dx)
      py (+ py dy)
      )
 (setq pmin (list px py))

(setvar 'attdia 0)
(setvar 'attreq 0)
(setvar 'osmode 0)
(setvar 'qaflags 1)
;;;(command "_.-insert" "svet" (trans pmin 1 0) "1.0"  "0.0")
(vl-cmdf "_.-insert" "svet" "_S" 1.0 "_R" 0.0 "_none" (trans pmin 1 0))
(setvar 'qaflags 0)
(setq bk (entlast))
  (terpri)
  (setq rows (itoa m)
	cols (itoa n))
(vl-cmdf "_.-array" bk "" "_R" m n (/ wid (1- m)) (/ leg (1- n)) )
)
   )
(*error* nil)
(princ)
)
(c:lig)
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 01.12.2011, 13:28
#16
Seryj_Wolk

Инженер-электрик
 
Регистрация: 04.03.2008
Псков
Сообщений: 59


Заработало!!! Но с некоторыми багами.
Во-первых. Расстояния по оси Х и по оси Y откладываются одинаковые.

А во-вторых, все равно после того как выводятся расставленные блоки выводится такое сообщение

Требуется целое значение от 1 до 32767, или ключевое слово.
; ошибка: В функции *error* возникла ошибка:Функция отменена
Количество отменяемых операций или [Авто/Управление/Начало/Конец/Метка/Обратно]
<1>: А
Задайте состояние режима автоотмены [Вкл/Откл] <Вкл>: В
Команда:

Блоки остаются после этого
Seryj_Wolk вне форума  
 
Непрочитано 01.12.2011, 14:30
#17
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Seryj_Wolk Посмотреть сообщение
Заработало!!! Но с некоторыми багами.
Во-первых. Расстояния по оси Х и по оси Y откладываются одинаковые.

А во-вторых, все равно после того как выводятся расставленные блоки выводится такое сообщение

Требуется целое значение от 1 до 32767, или ключевое слово.
; ошибка: В функции *error* возникла ошибка:Функция отменена
Количество отменяемых операций или [Авто/Управление/Начало/Конец/Метка/Обратно]
<1>: А
Задайте состояние режима автоотмены [Вкл/Откл] <Вкл>: В
Команда:

Блоки остаются после этого
Если ты запускаешь как есть (скопированный полностью) из консоли
после ошибки смотри в меню редактора Debug--> Last Break source
Тебе укажет проблемное место в коде
А по поводу ккие значения по осям я уже сказал
возьми за основу и делай как надо
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Команда наподобие массива



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Печать из модели по выбору объекта zenon Программирование 192 04.05.2017 09:41
Преобразование полей в текст YuraVel AutoCAD 17 14.04.2015 14:30
как выбрать Highlight (подсвеченные объекты) на lisp gizmo_zx LISP 19 12.10.2010 14:36
ACAD-2002. Глюк начальной загрузки ЛИСП? ===AAA=== LISP 27 31.08.2005 07:58