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

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

Построение прямоуголькина по выбранному элементу списка popup_list

Ответ
Поиск в этой теме
Непрочитано 12.10.2014, 22:55 #1
Построение прямоуголькина по выбранному элементу списка popup_list
nynokne
 
Регистрация: 17.02.2014
Сообщений: 50

Здравствуйте.
Решил ускорить процесс черчения типовых узлов при помощи lisp и dcl.


Есть файл DCL:

Код:
[Выделить все]
prm: dialog{label="Установка параметров прямоугольника";
   :edit_box{label="Ширина прямоугольника, м ";key="shir" ;value="0.00"; edit_width=8;}
    :edit_box{label="Высота прямоугольника, м ";key="vst" ;value="0.00"; edit_width=8;}
     : popup_list {key = "f1"; label ="Типовые размеры"; height = 10; width = 9; multiple_select = false; fixed_width_font = false;
fixed_height=false; fixed_width=false;list="10*5\n10*8\n15*5\nВвести вручную";value=3}

	ok_cancel;
}
Есть файл lisp:

Код:
[Выделить все]
 (defun c:show_prm (/ shir1 vst1 p1 num p2 dial)
  (if (< (setq num (load_dialog "prm.dcl")) 0) (exit))
  (if (not (new_dialog "prm" num)) (exit))
	
	(action_tile "shir" "(setq shir1 (atof $value))")
		(terpri)
			(princ shir1)
	(action_tile "vst" "(setq vst1 (atof $value))")
		(terpri)
			(princ vst1)
			(terpri)
  (action_tile "cancel" "(setq dial 1)")
  (start_dialog)
  (unload_dialog num)
	(setq nomer atoi((get_tile "f1")))
	(if (= 3 nomer)
		(progn
	(setq p1 (getpoint "\nУкажите пожалуйста точку вставки: ")) ;запрос точки 
	(setq p2 (mapcar '+ p1 (list shir1 (* -1 vst1))))
                )
        (setq nomer atoi((get_tile "f1")))
	(if (= 0 nomer)
		(progn
	(setq p1 (getpoint "\nУкажите пожалуйста точку вставки: ")) ;запрос точки 
	(setq p2 (mapcar '+ p1 (list 10 -5)))
                )
        )
        )
        
	(command "_.rectangle" p1 p2)
  (princ)
)
Я пытаюсь сделать следующее: Если в выпадающем списке выбрано "Ввести вручную", то прямоугольник строиться по параметрам, заданным в edit_box; Если же выбран один из типовых прямоугольников, то автокад строит прямоугольник нужного размера.
Как я понял, (setq nomer atoi((get_tile "f1"))) должен возвращать номер позиции выбранного элемента из списка f1, потом этот номер я сравниваю со всеми значениями, при определённых условиях делается построение по переменным, по другим условиям - строится по конкретным значениям. Но, видимо, я не понял, как работает функция get_tile со списком.
В конечном счёте строящиеся фигуры будут состоять из гораздо большего количества точек, но даже с прямоугольником ничего не получается.
Заранее благодарен за помощь.

Последний раз редактировалось Кулик Алексей aka kpblc, 12.10.2014 в 23:07.
Просмотров: 4243
 
Непрочитано 12.10.2014, 23:26
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Раз не понял, добавь тогл и не парься
gomer вне форума  
 
Непрочитано 12.10.2014, 23:36
1 | #3
Кулик Алексей aka kpblc
Moderator

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


action_tile для f1 пропиши - это будет проще. И не забудь про знаменитейшие грабли
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.10.2014, 23:45
#4
nynokne


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
action_tile для f1 пропиши - это будет проще. И не забудь про знаменитейшие грабли
Спасибо! action_tile помогло! про грабли буду читать)
nynokne вне форума  
 
Непрочитано 12.10.2014, 23:57
#5
Кулик Алексей aka kpblc
Moderator

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


Сильно устамши, поэтому код не оптимален ни разу. Если охота - разбирайся
Код:
[Выделить все]
 (defun test (/ dcl_file dcl_handle callback dcl_id dcl_lst dcl_res pt)

  (defun add_or_subst (lst key value)
    (if (assoc key lst)
      (subst (cons key value) (assoc key lst) lst)
      (cons (cons key value) lst)
      ) ;_ end of if
    ) ;_ end of defun

  (defun callback (key value ref / sub pos)
    (cond
      ((= key "shir") (set ref (add_or_subst (eval ref) key (atof value))))
      ((= key "vst") (set ref (add_or_subst (eval ref) key (atof value))))
      ((= key "f1")
       (if (vl-string-search "*" (setq pos (nth (atoi value) (cdr (assoc "avail" dcl_lst)))))
         (progn
           (setq sub (cons (substr pos 1 (vl-string-search "*" pos))
                           (substr pos (+ 2 (vl-string-search "*" pos)))
                           ) ;_ end of cons
                 ) ;_ end of setq
           (foreach item (list (cons "shir" (car sub))
                               (cons "vst" (cdr sub))
                               ) ;_ end of list
             (set_tile (car item) (cdr item))
             (mode_tile (car item) 1)
             (callback (car item) (cdr item) ref)
             ) ;_ end of foreach
           ) ;_ end of progn
         (foreach item '(("shir" . 0) ("vst" . 0))
           (set_tile (car item) (itoa (cdr item)))
           (mode_tile (car item) 0)
           (callback (car item) (itoa (cdr item)) ref)
           ) ;_ end of foreach
         ) ;_ end of if
       (set ref (add_or_subst (eval ref) key (atoi value)))
       )
      ) ;_ end of cond
    ) ;_ end of defun

  (setq dcl_file   (strcat (vl-string-right-trim "\\" (getenv "TEMP")) "\\dlg1.dcl")
        dcl_handle (open dcl_file "w")
        ) ;_ end of setq
  (foreach item
           '("prm: dialog{label=\"Установка параметров прямоугольника\";"
             ":edit_box{label=\"Ширина прямоугольника, м \";key=\"shir\";edit_width=8;}"
             ":edit_box{label=\"Высота прямоугольника, м \";key=\"vst\";edit_width=8;}"
             ":popup_list {key = \"f1\"; label =\"Типовые размеры\"; height = 10; width = 9; multiple_select = false; fixed_width_font = false;"
             "fixed_height=false; fixed_width=false;}"
             "ok_cancel;"
             "}"
             )
    (write-line item dcl_handle)
    ) ;_ end of foreach
  (close dcl_handle)
  (setq dcl_id (load_dialog dcl_file))
  (new_dialog "prm" dcl_id "(callback $key $value 'dcl_lst)")
  (action_tile "accept" "(done_dialog 1)")
  (action_tile "cancel" "(done_dialog 0)")
  (start_list "f1" 3)
  (mapcar
    (function add_list)
    (cdr (assoc "avail"
                (setq dcl_lst (add_or_subst dcl_lst
                                            "avail"
                                            '("10*5" "10*8" "15*5" "Вручную")
                                            ) ;_ end of add_or_subst
                      ) ;_ end of setq
                ) ;_ end of assoc
         ) ;_ end of cdr
    ) ;_ end of mapcar
  (end_list)
  (foreach item '(("shir" . 0)
                  ("vst" . 0)
                  ("f1" . 3)
                  )
    (set_tile (car item) (itoa (cdr item)))
    (callback (car item) (itoa (cdr item)) 'dcl_lst)
    ) ;_ end of foreach
  (setq dcl_res (start_dialog))
  (unload_dialog dcl_id)
  (if (and (= dcl_res 1)
           (/= 0. (* (cdr (assoc "vst" dcl_lst)) (cdr (assoc "shir" dcl_lst))))
           (= (type (setq pt (vl-catch-all-apply
                               (function
                                 (lambda ()
                                   (getpoint "\nУкажите точку вставки <Отмена> : ")
                                   ) ;_ end of LAMBDA
                                 ) ;_ end of function
                               ) ;_ end of VL-CATCH-ALL-APPLY
                          ) ;_ end of setq
                    ) ;_ end of type
              'list
              ) ;_ end of =
           ) ;_ end of and
    (command "_.rectang"
             "_none"
             pt
             "_none"
             (mapcar
               (function +)
               pt
               (list (cdr (assoc "shir" dcl_lst))
                     (- (cdr (assoc "vst" dcl_lst)))
                     ) ;_ end of list
               ) ;_ end of mapcar
             ) ;_ end of command
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.10.2014, 01:12
1 | #6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если охота - разбирайся
Не нано, авось избежит твоих "ошибок". Все гораздо проще.
Диалог я бы так сделал, например
Код:
[Выделить все]
prm : dialog {
  label="Установка параметров прямоугольника";
  : row {
    : column {
      : list_box {	key = "f1";
			list="10x5\n10x8\n15x5";
			value=3;
		}
    }
    : column {
      : toggle { label ="Типовые размеры"; key = "ui";}
      : boxed_column {
	key = "usrd";
	: edit_box {    label	   = "Ширина, м ";
			key	   = "shir" ;
			value	   = "0.00";
			edit_width = 8;
		   }
	: edit_box {    label	   = "Высота, м ";
			key	   ="vst" ;
			value	   = "0.00";
			edit_width = 8;
   		   }
		   spacer;
      }
      ok_cancel;
    }
  }
}
gomer вне форума  
 
Автор темы   Непрочитано 13.10.2014, 01:28
#7
nynokne


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


Цитата:
Сообщение от gomer Посмотреть сообщение
Не нано, авось избежит твоих "ошибок". Все гораздо проще.
Диалог я бы так сделал, например
За диалог спасибо, но я так и не понял, как сам лисп прописать.

----- добавлено через ~9 ч. -----
Пока разобрался с выпадающим списком, возник новый вопрос:
В выпадающем списке по умолчанию стоит "Ввести вручную", т.е. значение, которое будет наиболее часто использоваться. Но, если список не активировать, т.е. нажать на него и выбрать "Ввести вручную", lisp вообще не выполняется, т.к. не сработала функция action_tile. Как на кнопку "ОК" посадить проверку всех заполненных esit_box и остальных элементов диалогового окна?
И ещё вопрос: посоветуйте, где можно найти примеры "от простого к сложному" по работе с диалоговыми окнами. Соответствующую главу из книгу Полещука я прочитал уже раза 3, но там один хороший пример, который для меня пока сложноват....
nynokne вне форума  
 
Непрочитано 14.10.2014, 18:46
#8
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Посмотри здесь:
http://www.afralisp.net/dialog-control-language/
__________________
Никогда не спорьте с дураками - они опустят Вас до своего уровня и победят за счет опыта
CB вне форума  
 
Непрочитано 14.10.2014, 21:16
#9
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от nynokne Посмотреть сообщение
За диалог спасибо
Разберись сначала с данными. Например храни свои размеры в списке '(("10x20" 10 20)("20x20" 20 20) ("10x30" 10 30)("20x30" 20 30)). Из такого списка можно легко заполнить листбокс и извлечь размеры.
Повесь на тогл переключатель доступности f1 и usrd. да, именно всей колонки. на accept повесь проверку чекнутости ui и соответственно выбирай размеры либо из из списка по листбокс, либо из едитбоксов
gomer вне форума  
 
Непрочитано 14.10.2014, 21:30
#10
Кулик Алексей aka kpblc
Moderator

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


А хочешь - пройдись по представленным кодам в пошаговом режиме с контролем значений переменных
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Построение прямоуголькина по выбранному элементу списка popup_list

Опции темы Поиск в этой теме
Поиск в этой теме:

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