Я начинаю заниматься программированием LISP (help) - Страница 8
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Я начинаю заниматься программированием LISP (help)

Я начинаю заниматься программированием LISP (help)

Ответ
Поиск в этой теме
Непрочитано 19.02.2006, 20:00
Я начинаю заниматься программированием LISP (help)
mmax
 
Программист широкого профиля.
 
Челябинск
Регистрация: 08.09.2005
Сообщений: 722

Гопода, я начал этим заниматься совсем недавно, буквально в этом месяце. И у меня уже есть грандиозные планы например: чтобы автокад рисовал какие нибудь стандартные детали сам (болты, гайки шурупы итд)

И соответственно у меня начали появляться вопросы на которые г-н Полещук НН в своих произведениях не смог ответить в полном объеме, значит мне понадобится чья нибудь еще помощь.

У меня уже были вопросы которые я задал здесь и получил исчерпывающие ответы. Но если я на кждый вопрос буду создавать отдельный топик, то количество топиков будет = кол-ву вопросов, а вопросов миллион -- администраторы и модераторы данного ресурса наверное понимают о чем я. Да и такое кол-во ссылок не влезет мой..........

Вобщем я хотел бы все свои вопросы помещать в этот топик и надеюсь на поддержку знающих людей.

Всем заранее благодарен.
Просмотров: 79689
 
Автор темы   Непрочитано 17.03.2006, 20:39
#141
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от {Smirnoff}
А в данном случае с распечаткой программировать ничего не надо. Просто надо поиметь *.dwt сделанные для распечатки из пространства листов на разные форматы для соответствующего плотера.
Еще как надо -- несовместимость настроек принтера. Я на свой вкус настраиваю , а у них по умолчанию.
mmax вне форума  
 
Автор темы   Непрочитано 18.03.2006, 18:18
#142
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Zouss
to mmax

что то ты совсем отчаялся если такой обходной путь ищешь...
Plotsettings - это pagesetup, для каждого layout и для модели эта группа будет... Так вот, чтобы получить ((0 . "PLOTSETTINGS") надо сначала получить ((0 . "имянужногоLayout") а уже затем из этого составного объекта можно выдернуть ((0 . "PLOTSETTINGS") и все остальное Ежели хочешь погеморроиться поищи в хелпе акада на тему Creating & modifying complex entities
Насколько я понимаю с Plotsettings работают так же как с примитивами при помощи entmake
Все настройки печати можно поместить в список с DXF кодами у меня на них есть расшифровка на две страницы.
Мне кажется достаточно сварганить список например ((0. "Plotsettings") (2 . "HP450.PC3") (4 . "oversise ISO A1") (44 841) (45 594) (И . "так далее")) -- печать сконфигурирована
Вот только явно что entmake не запустит печать а этот список без определенных действий над ним не внедрится в базу рисунка.
Скажите пожалуйста как запустить печать с параметрами из этого списка.
mmax вне форума  
 
Непрочитано 20.03.2006, 10:03
#143
Zouss


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


Цитата:
Сообщение от mmax
Насколько я понимаю с Plotsettings работают так же как с примитивами при помощи entmake
совершенно верно, только такой путь хлопотный очень (по моему)
вот например как создается полилиния (пример из хелпа acada)
Код:
[Выделить все]
(entmake '((0 . "POLYLINE")    ; Object type
          (62 . 5)             ; Color
          (6 . "dashed")       ; Linetype
          (66 . 1)             ; Vertices follow
) )
(entmake '((0 . "VERTEX")      ; Object type
          (10 1.0 1.0 0.0)     ; Start point
) )
(entmake '((0 . "VERTEX")      ; Object type
          (10 4.0 6.0 0.0)     ; Second point
) )
(entmake '((0 . "VERTEX")      ; Object type
          (10 3.0 2.0 0.0)     ; Third point
) )
(entmake '((0 . "SEQEND")))    ; Sequence end
здесь "vertex" - подпримитив, в составе сложного примитива "polyline". В случае если ты будешь пользовать layout, надо будет кроме него определить эти самые plotsettings, wievports и т.д. Утешает то, что неуказанные DXF коды устанавливаются сами по умолчанию. Для подобных эпизодических вещей я пользую ("command - проще и быстрей отлаживается
Zouss вне форума  
 
Непрочитано 20.03.2006, 10:09
#144
Кулик Алексей aka kpblc
Moderator

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


Через (entmake) сделать Viewport нельзя, о чем прописывается в справке.
Насчет plotsettings - я думаю, что через (entmake) до них слишком тяжело будет добраться. Скорее всего, придется идти через (vla-) функции.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.03.2006, 11:01
#145
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


mmax
ИМХО - Вы просто плохо себе представляете сложность поставленной задачи, она никак не согласуется с названием темы. Однако я верю что при желании у вас все получится (хотя, я считаю что оно того не стоит). Исключительно ради примера, из моей мусорной корзинки такое произведение в тему (авось Вам поможет).
ПРЕДУПРЕЖДЕНИЕ: глюков там может быть немеряно, сам я этим не поьзуюсь, но когда-то оно работало, для примера сойдет.

Программа по выделенному участку в модели с заданным масштабом строит ВЭ в листе, для которого присваивается подбираемый формат и плоттер в зависимости от величины ВЭ, основная вызываемая функция C:APEL-PLOT-FORMAT.

Код:
[Выделить все]
;;;Получение списка всех конфигураций листов для всех принтеров
;;;!!!Прога работает достаточно долго, зависит от количества принтеров и форматов для них.
;;;!!!нужно перед запуском давать на это предупреждение
;;;Apelsinov
;;;18.05.05
(defun APEL-PLOT-LIST_CONF (/ new_plot_config list_plot_device)
  (setq	new_plot_config
	 (vla-add (vla-get-PlotConfigurations
		    (APEL-ACTIVE_DOCUMENT)
		  )
		  "APEL_TEMP"
	 )
  )
  (setq	list_plot_device
	 (vlax-safearray->list
	   (vlax-variant-value
	     (vla-GetPlotDeviceNames new_plot_config)
	   )
	 )
  )
  (if (vlax-property-available-p new_plot_config 'ConfigName T)
    (mapcar
      (FUNCTION
	(LAMBDA	(i)
	  (vla-put-ConfigName new_plot_config i)
	  (list	i
		(mapcar
		  (FUNCTION
		    (LAMBDA (f / A B)
		      (vla-put-CanonicalMediaName new_plot_config f)
		      (vla-GetPaperSize new_plot_config 'A 'B)
		      (list
			(vla-GetLocaleMediaName new_plot_config f)
			(list A B)
		      )
		    )
		  )
		  (vlax-safearray->list
		    (vlax-variant-value
		      (vla-GetCanonicalMediaNames
			new_plot_config
		      )
		    )
		  )
		)
	  )
	)
      )
      list_plot_device
    )
  )
)


;;;Запись конфигураций принтеров в файл
;;;Apelsinov
;;;18.05.05
(defun APEL-PLOT-LIST_CONF-FILE	(file_name / list_conf lit_conf_str)
  (setq list_conf (APEL-PLOT-LIST_CONF))
  (setq	conf_str
	 (apply	'STRCAT
		(mapcar
		  (function (LAMBDA (f) (strcat "\n" f)))
		  (apply
		    'append
		    (mapcar
		      (FUNCTION
			(LAMBDA	(i)
			  (cons
			    (VL-PRIN1-TO-STRING (car i))
			    (mapcar
			      (FUNCTION
				(LAMBDA	(a)
				  (apply 'strcat
					 (list
					   (VL-PRIN1-TO-STRING (car a))
					   " "
					   (VL-PRIN1-TO-STRING (cadr a))
					 )
				  )
				)
			      )
			      (cadr i)
			    )
			  )
			)
		      )
		      list_conf
		    )
		  )
		)
	 )
  )
  (if (setq file_patch (FINDFILE file_name))
    (APEL-FILE-WRITE_STR_W file_patch conf_str)
  )
)
;;;(APEL-PLOT-LIST_CONF-FILE "apel-plot-conf.txt")

;;;Запись строки в файл
;;;Apelsinov
;;;18.05.05
(defun APEL-FILE-WRITE_STR_W (file_name str /)
  (if (setq file_name (open file_name "W"))
    (progn
      (WRITE-LINE str file_name)
      (close file_name)
    )
  )
)

;;;Запуск activex и основных глобальных переменных
;;;Apelsinov
;;;13.05.05
(defun APEL-ACAD_APPLICATION ()
  (if (null *apel_acad_application*)
    (setq *apel_acad_application* (vlax-get-acad-object))
    *apel_acad_application*
  )
)

;;;Apelsinov
;;;18.05.05
(defun APEL-ACTIVE_DOCUMENT ()
  (if (null *apel_active_document*)
    (setq *apel_active_document*
	   (vla-get-activedocument
	     (APEL-ACAD_APPLICATION)
	   )
    )
    *apel_active_document*
  )
)

;;;Apelsinov
;;;18.05.05
(defun APEL-MODEL_SPACE	()
  (if (null *apel_model_space*)
    (setq *apel_model_space*
	   (vla-get-modelspace
	     (APEL-ACTIVE_DOCUMENT)
	   )
    )
    *apel_model_space*
  )
)

;;;Apelsinov
;;;18.05.05
(defun APEL-PAPER_SPACE	()
  (if (null *apel_paper_space*)
    (setq *apel_paper_space*
	   (vla-get-paperspace
	     (APEL-ACTIVE_DOCUMENT)
	   )
    )
    *apel_paper_space*
  )
)


;;;Преобразование списка целых чисел в список вещественных
;;;Apelsinov
;;;12.05.05
(defun APEL-SP-INT_TO_REAL (spis /)
  (mapcar (FUNCTION
	    (LAMBDA (i)
	      (mapcar (FUNCTION (LAMBDA (i) (* i 1.0))) i)
	    )
	  )
	  spis
  )
)

;;;Вычисление минимального прямоугольника из заданных в кот. вписывается исходный
;;;razm_0 - исходный (A B)
;;;spis_razm - заданные: ((A1 B1)(A2 B2)...(Ai Bi))
;;;Apelsinov
;;;12.05.05
(defun APEL-MAT-PODBOR_PEC (razm_0 spis_razm / spis_razm_1 spis_razm_2)
  (car
    (vl-sort (VL-REMOVE-IF
	       (FUNCTION
		 (LAMBDA (i)
		   (or (> (apply 'max razm_0) (apply 'max i))
		       (> (apply 'min razm_0) (apply 'min i))
		   )
		 )
	       )
	       (APEL-SP-INT_TO_REAL spis_razm)
	     )
	     (FUNCTION (lambda (i1 i2) (< (apply '* i1) (apply '* i2))))
    )
  )
)

;;;(APEL-MAT-PODBOR_PEC razm_0 spis_razm)
;;;Нахождение масштаба по расстоянию на чертеже и реальному расстоянию
;;;Apelsinov
;;;11.05.2005
(defun APEL_SCALE_POINTS (/ dist_real dist_draw)
  (if
    (and (setq dist_draw (getdist "\n Введите расстояние по чертежу:"))
	 (princ dist_draw)
	 (setq dist_real (getdist "\n Введите истинное расстояние:"))
    )
     (progn
       (setq scale (/ dist_real dist_draw))
       (princ (STRCAT "Указанный масштаб: " (rtos scale 2 5)))
       scale
     )
  )
)
;;;(APEL_SCALE_POINTS)


;;;Диалог ввода в ком строке текущего масштаба,
;;;с масштабом по умолчанию равным DIMSCALE
;;;и возможностью ввода масштаба по расстоянию
;;;Apelsinov
;;;11.05.2005
;;;Функции:
;;;APEL_SCALE_POINTS
(defun APEL_SCALE_TEXTDIAL (/ umolch_str ap_scale)
  (setq	umolch_str
	 (STRCAT "\n Введите масштаб или [Points] <"
		 (rtos (getvar "DIMSCALE") 2 3)
		 ">:"
	 )
  )
  (while (null ap_scale)
    (initget 4 "Points")
    (setq ap_scale (getreal umolch_str))
    (setq ap_scale (cond ((null ap_scale) (getvar "DIMSCALE"))
			 ((eq ap_scale "Points") (APEL_SCALE_POINTS))
			 ((eval ap_scale))
		   )
    )
  )
)
;;;(apel_scale_textdial)

;;;Apelsinov
;;;18.05.05
(defun APEL-FILE-READ (fname / str spis)
  (if (setq fname (open fname "r"))
    (progn
      (while (setq str (read-line fname))
	(setq spis (cons str spis))
      )
      (close fname)
      (reverse spis)
    )
  )
)
;;;(apel-file-read "C:\\ACAD_СD\\lisp\\apel-plot-format\\apel-plot-format.txt")

;;;Преобразование прочтенного файла APEL-PLOT-FORMAT в ассоциативный список
;;;имен форматов и списков их сторон
;;;name_file - имя файла
;;;возвр: список или Nil если файл не найден
(defun APEL-PLOT-FORMAT_FILE_ASSOC_LIST
       (name_file / file_patch name_format)
  (if (setq file_patch (FINDFILE name_file))
    (vl-Remove 'nil
	       (mapcar (FUNCTION
			 (LAMBDA (i)
			   (if (setq name_format (read i))
			     (cons
			       (read
				 (substr
				   i
				   (+ 4 (STRLEN name_format))
				 )
			       )
			       name_format
			     )
			   )
			 )
		       )
		       (apel-file-read file_patch)
	       )
    )
  )
)
;;;(APEL-PLOT-FORMAT_FILE_ASSOC_LIST "apel-plot-format.txt")

;;;Стороны прямоуугольника по двум заданным точкам
;;;Возврат - список длин сторон, или nil, если точки не были указаны
;;;Apelsinov
;;;11.05.2005
(defun APEL-LENDREC2POINT (point_1 point_2 /)
  (reverse
    (cdr (reverse (mapcar 'abs (mapcar '- point_1 point_2))))
  )
)
;;;(APEL-LENDREC2POINT )

;;;Нахождение каноничесого  имени формата листа по локальному
;;;name_format - имя формата листа локальное
;;;lay - VLA-OBJECT IAcadLayout
;;;  Apelsinov
;;;  13.05.05
(defun APEL-LAYOUT-LOCALE_TO_CANONICAL
       (name_format lay / list_canonical_name list_locale_mames)
  (setq	list_canonical_name
	 (vlax-safearray->list
	   (vlax-variant-value
	     (vla-getCanonicalMediaNames lay)
	   )
	 )
  )
  (setq	list_locale_mames
	 (mapcar (FUNCTION (LAMBDA (i) (vla-GetLocaleMediaName lay i)))
		 list_canonical_name
	 )
  )
  (cdr
    (assoc name_format
	   (mapcar 'cons list_locale_mames list_canonical_name)
    )
  )
)

;;;Создание viewport и его включение
;;;center_point - центр. точка список
;;;Apelsinov
;;;18.05.05
;;;A - ширина
;;;B - высота
(Defun APEL-PVPORT-CREATE (center_point A B / new_pvport)
  (vla-put-ViewportOn
    (setq new_pvport
	   (vla-AddPViewport
	     (APEL-PAPER_SPACE)
	     (vlax-3d-point center_point)
	     A
	     B
	   )
    )
    :vlax-true
  )
  new_pvport
)
;;;(APEL-PVPORT-CREATE '(297.0 210.0) 297.0 210.0) --> #<VLA-OBJECT IAcadPViewport 03436f74> 

;;;Создание листа
;;;Apelsinov
;;;18.05.05
;;;name-имя листа
;;;plotter- девайс
;;;format - формат бумаги
(Defun APEL-LAYOUT-CREATE_NAME_PLOTTER_FORMAT
					      (name plotter format /)
  (if (and (setq lay (APEL-LAYOUT-CREATE_NAME name (APEL-ACTIVE_DOCUMENT)))
	   (APEL-LAYOUT-APPLY-NAME_PLOTTER_FORMAT format plotter lay)
      )
    lay
  )
)
;;;(APEL-LAYOUT-CREATE_NAME_PLOTTER_FORMAT "JHDFGFD" "HP DesignJet 500 42 by HP.pc3" "Oversize: ISO A1  (landscape)")

;;;ориентация прямоугольника, заданного списком сторон
;;;1 - "Portrait"
;;;0 - "Landscape"
(defun APEL-PLOT-REC_ORIENT_AB (list_AB /)
  (if (apply '< list_AB)
    1
    0
  )
)
;;;(APEL-PLOT-REC_ORIENT_AB '(210 210)) -> 0

;;;имя для layout
;;;Apelsinov
;;;18.05.05
;;;name - строка с именем - к ней добавляется число
(defun APEL-PLOT-NEW_LAYT_NAME_N
       (name / laut_names_list N new_layt_name)
  (setq N 1)
  (while (member
	   (setq new_layt_name (STRCAT name (rtos N 2 0)))
	   (APEL-LAYOUTS-LIST_NAMES (APEL-ACTIVE_DOCUMENT))
	 )
    (setq N (+ N 1))
  )
  new_layt_name
)
;;;  (apel-plot-new_layt_name_N "TY_") - > "TY_1"

;;;Задание дырке в ВЭ окна по двум углам модели
;;;Apelsinov
;;;16.05.05
;;;Арг:
;;;new_vport - pvport для кот. задается
;;;point_1 - 1-й угол окна
;;;point_2 - 2-й угол окна
(defun APEL-VPORT-ZOOM_WINDOW
       (new_vport point_1 point_2 / svar_CMDECHO)
  (vlax-property-available-p (APEL-ACTIVE_DOCUMENT) 'mspace T)
  (vla-put-mspace (APEL-ACTIVE_DOCUMENT) :vlax-true)
  (vla-put-ActivePViewport (APEL-ACTIVE_DOCUMENT) new_vport)
  (setq svar_CMDECHO (getvar "CMDECHO"))
  (setvar "CMDECHO" 0)
  (vl-cmdf "_.ZOOM" "_W" point_1 point_2)
  (setvar "CMDECHO" svar_CMDECHO)
  (vla-put-mspace (APEL-ACTIVE_DOCUMENT) :vlax-false)
)

;;;Список имен всех листов в чертеже
;;;Apelsinov
;;;18.05.05
(defun APEL-LAYOUTS-LIST_NAMES (acad_document / laut_names_list)
  (vlax-for i (vla-get-Layouts acad_document)
    (setq laut_names_list (cons (vla-get-name i) laut_names_list))
  )
)
;;;(apel-layouts-list_names (APEL-ACTIVE_DOCUMENT)) -> ("Model" "Layout1")

;;;Присвоение листу плоттера с
;;;проверкой на существование такого имени плоттера/принтера
;;;Apelsinov
;;;18.05.05
;;;name_plotter - имя принтера
;;;layt - layout vla-obj
(defun APEL-LAYOUT-APPLY-NAME_PLOTTER (name_plotter layt /)
  (cond	((MEMBER name_plotter
		 (vlax-safearray->list
		   (vlax-variant-value (vla-GetPlotDeviceNames layt))
		 )
	 )
	 (null (vla-put-ConfigName layt name_plotter))
	)
  )
)
;;;(APEL-LAYOUT-APPLY-NAME_PLOTTER "large_format_of_DJ500.pc3" layt) --> T
;;;(APEL-LAYOUT-APPLY-NAME_PLOTTER "QWERasdf" layt) --> nil

;;;Присвоение листу формата и плоттера
;;;Проверкой на существование такого имени формата листа и плоттера
;;;ед.изм - мм
;;;масштаб листа устанавливается 1/1
;;;Apelsinov
;;;18.05.05
;;;name_format - имя формата
;;;name_plotter - имя принтера
;;;layt - layout vla-obj
(defun APEL-LAYOUT-APPLY-NAME_PLOTTER_FORMAT
       (name_format name_plotter layt / can_name_format)
  (if (APEL-LAYOUT-APPLY-NAME_PLOTTER name_plotter layt)
    (if	(setq can_name_format
	       (APEL-LAYOUT-LOCALE_TO_CANONICAL
		 name_format
		 layt
	       )
	)
      (progn
	(null (vla-put-UseStandardScale layt :vlax-false))
	(null (vla-SetCustomScale layt 1 1))
	(null (vla-put-CanonicalMediaName layt can_name_format))
	(null (vla-put-PaperUnits layt acMillimeters))
      )
    )
  )
)
;;;(APEL-LAYOUT-APPLY-NAME_PLOTTER_FORMAT "Oversize: Custom 4: 1050 x 594 mm. (landscape)" "HP DesignJet 500 42 by HP.pc3" layt)

;;;Создание листа с именем name_layout
;;;с проверкой на существование с таким именем уже
;;;Apelsinov
;;;18.05.05
;;;name_layout - строка с именем листа
;;;DOCUMENT - документ в кот создается лист
(defun APEL-LAYOUT-CREATE_NAME (name_layout DOCUMENT /)
  (if (null
	(member	name_layout
		(APEL-LAYOUTS-LIST_NAMES DOCUMENT)
	)
      )
    (vla-add (vla-get-Layouts (APEL-ACTIVE_DOCUMENT))
	     name_layout
    )
  )
)
;;;(APEL-LAYOUT-CREATE_NAME "QWERHGFGD" (APEL-ACTIVE_DOCUMENT)) --> #<VLA-OBJECT IAcadLayout 03415134>

;;;Определение ориентации по лимитам
;;;Apelsinov
;;;18.05.05
(defun APEL-LIMIT-ROTATION_REAL	(/)
  (APEL-PLOT-REC_ORIENT_AB
    (APEL-LENDREC2POINT
      (append (GETVAR "LIMMAX") (list 0))
      (append (GETVAR "LIMMIN") (list 0))
    )
  )
)

;;;Apelsinov
;;;18.05.05
(defun C:APEL-PLOT-FORMAT
			  (/		point_1	     point_2
			   assoc_format_list	     rec_0
			   rec_1	scale	     str_error
			   format	new_layt
			  )
  (if (eq 1 (vla-get-ActiveSpace (APEL-ACTIVE_DOCUMENT)))
    (if	(setq assoc_format_list
	       (APEL-PLOT-FORMAT_FILE_ASSOC_LIST
		 "apel-plot-format.txt"
	       )
	)
      (progn
	(setq point_1 T)
	(while (and point_1 (null (listp point_1)))
	  (initget "File")
	  (setq
	    point_1 (getpoint "\nSpecify first corner [File] <exit>:")
	  )
	  (if (eq point_1 "File")
	    (progn
	      (alert
		"\n ВНИМАНИЕ!!!
	      \n Вы хотите переписать файл конфигураций apel-plot-format.txt.
	      \n Если Вы уже пользовались этой опцией,
	      \n рекомендую сохранить уже имеющийся у вас файл apel-plot-format.txt.
		\n На создание файла конфигураций может уйти продолжительное время,
		\n около 15 минут, в зависимости от количества принтеров и их конфигураций"
	      )
	      (initget "Yes No")
	      (if
		(eq
		  (GETKWORD
		    "\n Вы действительно хотите переписать файл конфигураций apel-plot-format.txt [Yes/No] <Nо>:"
		  )
		  "Yes"
		)
	       (APEL-PLOT-LIST_CONF-FILE
		 "apel-plot-format.txt"
	       )
	      )
	    )
	  )
	)
	(if
	  (and point_1
	       (setq
		 point_2 (GETCORNER point_1
				    "\nSpecify opposite corner:<exit>:"
			 )
	       )
	       (setq rec_0 (APEL-LENDREC2POINT point_1 point_2))
	  )
	   (if (setq scale (APEL_SCALE_TEXTDIAL))
	     (PROGN
	       (setq
		 rec_0
		  (mapcar (FUNCTION (LAMBDA (i) (* i scale))) rec_0)
	       )
	       (if (setq rec_1 (APEL-MAT-PODBOR_PEC
				 rec_0
				 (mapcar 'car assoc_format_list)
			       )
		   )
		 (progn
		   (setq plot_devise
			  (cdr (assoc
				 'nil
				 (member
				   (setq format (assoc rec_1 assoc_format_list))
				   (reverse assoc_format_list)
				 )
			       )
			  )
		   )
		   (vla-put-ActiveLayout
		     (APEL-ACTIVE_DOCUMENT)
		     (setq
		       new_layt
			(APEL-LAYOUT-CREATE_NAME_PLOTTER_FORMAT
			  (APEL-PLOT-NEW_LAYT_NAME_N "TY_")
			  plot_devise
			  (cdr format)
			)
		     )
		   )
		   (if
		     (not (eq (APEL-PLOT-REC_ORIENT_AB rec_0)
			      (APEL-LIMIT-ROTATION_REAL)
			  )
		     )
		      (vla-put-PlotRotation
			new_layt
			(abs (- (vla-get-PlotRotation new_layt) 1))
		      )
		   )
		   (setq *apel_paper_space* nil)
		   (APEL-VPORT-ZOOM_WINDOW
		     (APEL-PVPORT-CREATE
		       (mapcar (FUNCTION (LAMBDA (i) (/ i 2))) rec_0)
		       (car rec_0)
		       (cadr rec_0)
		     )
		     point_1
		     point_2
		   )
		   (VL-CMDF "_.REGEN")
		   (setq str_error (strcat "Формат листа: "
					   (cdr format)
					   "\nДевайс: "
					   plot_devise
				   )
		   )
		 )
		 (setq str_error
			"Нет описания такого формата, возможно слишком большой"
		 )
	       )
	     )
	     (setq
	       str_error "Не был введен масштаб, программа остановлена"
	     )
	   )
	   (setq
	     str_error
	      "Не были введены углы рамки, программа остановлена"
	   )
	)
      )
      (setq str_error
	     "Не найден файл описания форматов, программа остановлена"
      )
    )
    (setq str_error
	   "Программа работает только в пространстве модели, перейдите в модель"
    )
  )
  (princ (strcat "\n" str_error))
  (princ)
)
Apelsinov вне форума  
 
Автор темы   Непрочитано 20.03.2006, 16:17
#146
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от Apelsinov
mmax
ИМХО - Вы просто плохо себе представляете сложность поставленной задачи, она никак не согласуется с названием темы. Однако я верю что при желании у вас все получится (хотя, я считаю что оно того не стоит). Исключительно ради примера, из моей мусорной корзинки такое произведение в тему (авось Вам поможет).
ПРЕДУПРЕЖДЕНИЕ: глюков там может быть немеряно, сам я этим не поьзуюсь, но когда-то оно работало, для примера сойдет.
Господа,
Я всетаки понял что запустить печать на чужом компьютере без моего участия лучше всетаки с помощью
Код:
[Выделить все]
(command "_.plot" ... ... ... )
Имея ввиду что у меня будет нужный PC3 и лист настроен на данную конфигурацию.
Программа предположительно на 2-3 строчки.
mmax вне форума  
 
Непрочитано 20.03.2006, 16:50
#147
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от mmax
Господа,
Я всетаки понял что запустить печать на чужом компьютере без моего участия лучше всетаки с помощью
Код:
[Выделить все]
(command "_.plot" ... ... ... )
Имея ввиду что у меня будет нужный PC3 и лист настроен на данную конфигурацию.
Программа предположительно на 2-3 строчки.
Честно говоря, я сам не пробовал запускать печать другим методом, а этого добра у нас есть (из той же мусорной корзинки):
Код:
[Выделить все]
;;;(plotml [имя принтера] [формат листа] [таблица стиля печати])
;;;например : ^C^C(plotml "HP Color Inkjet CP1700.pc3" "A4 (210 x 297 мм) " "000.CTB"),
;;;данные по принтеру и формату можете посмотреть поэкспериментировав с коммандой -plot.
;;;(на запрос принтера или формата введите ? , акад выдаст допустимые значения)
;;;Теперь, если вы нажмете на эту кнопку акад запросит от Вас две точки рамки,
;;;то что попадет в рамку будет напечатано на выбранном Вами принтере и формате,
;;;в соответствии с указанной таблицей. Масштаб будет вписанный (!)

;;;*********
;;;Apelsinov
;;;22.02.05
;;;plotml
;;;*********
(defun plotml (printer format tabulka / xy1 xy2)
  (if (and (setq xy1 (getpoint "\n Первый угол рамки <Выход>:"))
           (setq xy2 (getcorner xy1 "\n Второй угол рамки <Выход>:"))
      )
    (APEL-PLOT-WIN printer format tabulka (list xy1 xy2))
    (princ "\n Ничего распечатано небыло" )
  )
  (princ)
)

;;;*********
;;;Apelsinov
;;;22.02.05
;;;apel-plot-extents
;;;*********
(defun apel-plot-extents (printer format tabulka /)
;;;  (apel-plot-extents "LAZERPRINTER.pc3" "A4" "TIMUR.CTB") 
  (APEL-PLOT-WIN
    printer
    format
    tabulka
    (list (getvar "extmin") (getvar "extmax"))
  )
  (princ)
)

;;;*********
;;;Apelsinov
;;;22.02.05
;;;APEL-PLOT-WIN
;;;*********
(defun APEL-PLOT-WIN (printer format tabulka coord / a cmd xy1 xy2 L)
    (princ (strcat "\n Печать на "	       printer
		 "; Формат:"	format	       " Стиль:"
		 tabulka "\n"
		)
  )
  (setq	cmd (getvar "cmdecho")
	xy1 (car coord)
	xy2 (cadr coord)
	a   (angle xy1 xy2)
  )
  (if (or (and (> a (* pi 0.25)) (< a (* pi 0.75)))
	  (and (> a (* pi 1.25)) (< a (* pi 1.75)))
      )
    (setq a "_Portrait")
    (setq a "_Landscape")
  )
;;;  (setvar "cmdecho" 0)

  (if (eq (getvar "tilemode") 0)
    (VL-CMDF "_.-plot"			;сама команда
	     "_y"			;нужны настройки
	     ""				; Лист или модель
	     printer			;Собственно принтер
	     format			;Формат листа
	     "_Millimeters"		;Ед. измерения
	     a				;Ориентация листа
	     "_N"			;Зеркалить лист
	     "_Window"			;Область печати
	     xy1			;Первая точка окна
	     xy2			;Вторая точка окна
	     "_fit"			;Масштаб
	     "_center"			;Сдвиг листа
	     "_yes"			;Печать со стилем
	     tabulka			;Стиль
	     "_Yes"			;Учитывать заданные толщины линий
	     "_No"			;масштабироватьтолщины линий
	     "_No"			;Хрен че такое?
	     "_No"			;Удалять скрытые линии
	     "_No"			;Печатать в файл
	     "_no"			;Сохранить настройки
	     "_yes"			;Старт печати
	    )
    (VL-CMDF "_.-plot"			;сама команда
	     "_y"			;нужны настройки
	     "Model"			;Лист или модель
	     printer			;Собственно принтер
	     format			;Формат листа
	     "_Millimeters"		;Ед. измерения
	     a				;Ориентация листа
	     "_N"			;Зеркалить лист
	     "_Window"			;Область печати
	     xy1			;Первая точка окна
	     xy2			;Вторая точка окна
	     "_fit"			;Масштаб
	     "_center"			;Сдвиг листа
	     "_yes"			;Печать со стилем
	     tabulka			;Стиль
	     "_Yes"			;Учитывать заданные толщины линий
	     "_No"			;Удалять скрытые линии
	     "_No"			;Печатать в файл
	     "_No"			;Сохранить настройки
	     "_Yes"			;Старт печати
	    )
  )

;;;  (command "preview")
;;;  (setvar "cmdecho" cmd)
;;;(command "_.vbastmt" "ThisDrawing.Close False")
)
Apelsinov вне форума  
 
Непрочитано 20.03.2006, 20:27
#148
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Я смотрю тема пользуется популярность.
Поздравьте меня на конецто мне привезли книжку " LISP Секреты адоптации"
У меня вопрос требуется Сделать такую чтуку (4."fg")
Fg -переменная и должна меняться
  • (Setq i 1)
    (setq fg i)
    (setq fg (itoa fg))
    (Cons '4 '"fg")
    (setq i (+ i 1)
??????

Фрагмент программы.
favorite вне форума  
 
Непрочитано 20.03.2006, 20:37
#149
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


favorite
нифига не понятно...
если просто точечную пару из 4 и значения переменной fg, то:
Код:
[Выделить все]
(setq fg 1)
(cons 4 fg)
вернет пару: '(4 . 1)
Apelsinov вне форума  
 
Непрочитано 20.03.2006, 20:59
#150
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Да нет значение fg должно меняться от 1 до 100 к примеру
выглядить должно так (4 . "77") (4 . "78")......(4 . "100")
Просто я цикл не написал
favorite вне форума  
 
Непрочитано 20.03.2006, 22:21
#151
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Что то вроде такого
Код:
[Выделить все]
(setq i 1)
(while (<= i 100)
  (setq lst (cons (cons 4 (rtos i)) lst))
  (setq i (1+ i))
)
(reverse lst)
А в чем проблема то?
vk вне форума  
 
Непрочитано 21.03.2006, 08:20
#152
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Спасибо, но я вот так сделат
вместо cons Vl-lisT* вставил и получилось
  • (setq i 1)
    (while (< i 5)
    (setq a (nentsel))
    (setq a (car a))
    (setq st (entget a))
    (setq v (assoc 1 st))
    (entmod (subst (vl-list* 1 ( itoa i)) v st))
    (setq i (1+ i))
    (command "._regenall")
    )

А что делает rtos?
favorite вне форума  
 
Непрочитано 21.03.2006, 09:23
#153
VVA

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


>favorite
Цитата:
Поздравьте меня на конецто мне привезли книжку " LISP Секреты адоптации"
Цитата:
А что делает rtos?
стр. 95 п. 2.7.4.
VVA вне форума  
 
Автор темы   Непрочитано 22.03.2006, 00:31
#154
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Гспода, предлагаю вам на освистание программу черчения фланца.
В ней устранены все глюки и при принудительном выходе все переменные возвращаются на свои места.
В создании принимали участие:
vk
Apelsinov
Елпанов Евгений
[ATTACH]1142976684.rar[/ATTACH]
mmax вне форума  
 
Непрочитано 22.03.2006, 03:58
#155
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Гспода, предлагаю вам на освистание программу черчения фланца.
В ней устранены все глюки
Фланец начертить с первого раза не удалось. Зато получился фрагмент капустной грядки. Картинку прилагаю Рекомендую дачникам взять на вооружение
[ATTACH]1142989090.gif[/ATTACH]
Правда, в командной строке была какая то ругань, но с этим, я думаю, можно смириться


Шутка, конечно. А если серьезно, никогда не верь пользовательскому вводу. Каждое значение надо проверять. Капустная грядка получилась когда ввел отфонарные, явно неправильные значения. Правда, повторить не удалось, видимо, фонарь погас
vk вне форума  
 
Непрочитано 22.03.2006, 09:41
#156
Кулик Алексей aka kpblc
Moderator

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


> mmax : Несколько замечаний можно?
1. В самом конце файла проверь - поставлено двоеточие ":" вместо точки с запятой ";".
2. Что будет, если диалог не найден (не найден файл диалога, диалог не загрузился и проч?)
3. Внешние функции (типа получения списка имен слоев) можно засунуть как локальные в тело основной программы.
4. Можно заменить строку
Код:
[Выделить все]
(vl-cmdf "_.layer" "_s" layer_kontur_line_q "")
на такое (по выбору):
Код:
[Выделить все]
(setvar "clayer" layer_kontur_line)
;; Либо, если идти через vla-функции:
(vla-put-ActiveLayer (vla-get-ActiveDocument (vlax-get-acad-object)) (vla-item (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))) layer_kontur_line))
5. Опять же, с точки зрения "обезьяны с гранатой" (хотя тут больше подойдет тюбик со стронцием): что будет, если в (povtor_old_param) на запрос точки нажать Esc? Или правую кнопку мыши?
6. Несколько строк setq подряд желательно объединять в одну. Т.е. заменить
Код:
[Выделить все]
      (setq samo_polyg_nar_prop_q (entget samo_name_polyg_q_nar))
      (setq samo_spis_polyg_nar_prop_q (cdr samo_polyg_nar_prop_q))
      (setq samo_centr_nar_otv_q
	     (mapcar '(lambda (y) (assoc 10 (list y)))
		     samo_spis_polyg_nar_prop_q
		     ) ;_ end of mapcar
	    ) ;_ end of setq
      (setq samo_real_centrs_nar_otv_q
	     (vl-remove-if 'null samo_centr_nar_otv_q)
	    ) ;_ end of setq
на
Код:
[Выделить все]
      (setq samo_polyg_nar_prop_q
	     (entget samo_name_polyg_q_nar)
	    samo_spis_polyg_nar_prop_q
	     (cdr samo_polyg_nar_prop_q)
	    samo_centr_nar_otv_q
	     (mapcar '(lambda (y) (assoc 10 (list y)))
		     samo_spis_polyg_nar_prop_q
		     ) ;_ end of mapcar
	    samo_real_centrs_nar_otv_q
	     (vl-remove-if 'null samo_centr_nar_otv_q)
	    ) ;_ end of setq
7. И последнее Я бы вставил обработчик ошибок все-таки. Код публиковался и здесь, и на аркаде (прошу не наезжать - повторять код лень).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.03.2006, 09:45
#157
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от mmax
<...>В создании принимали участие:
vk
Apelsinov
Елпанов Евгений
Я буду все отрицать! [шутка]
Apelsinov вне форума  
 
Автор темы   Непрочитано 22.03.2006, 12:25
#158
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


К сожалению в 2006 работает глюкаво -- глюки с повторным запуском, которые отсутствовали в 2005. Вринципе эту функцию надо будет переработать. Хотя это не очень нужная функция можно от нее отказаться. Если в 2005 иногда оставался полигон то в 2006 появились какието странные точки соответствующие центрам отвертий.

Цитата:
Зато получился фрагмент капустной грядки
Цитата:
А если серьезно, никогда не верь пользовательскому вводу. Каждое значение надо проверять. Капустная грядка получилась когда ввел отфонарные, явно неправильные значения. Правда, повторить не удалось, видимо, фонарь погас
Ну здесь просто надо ввести нужные значения. Вы же когда разрабатываете фланец или лючок руководствуетесь не только фантазией, введите соответствующие действительноси значения и у вас все получится, а если расчетах у вас диаметры отверстий больше чем соединяющая их хорда, то вы явно гдето допустили ошибку в расчетах. Здесь я не буду ограничивать пользователя в фантазии, а вдруг ему действительно понадобится капуста.

Цитата:
2. Что будет, если диалог не найден (не найден файл диалога, диалог не загрузился и проч?)
Автокад должен сам с этим справиться.

Цитата:
3. Внешние функции (типа получения списка имен слоев) можно засунуть как локальные в тело основной программы.
Эта функция, предоставленная Apelsinovым, нужна будет для других программ, так же появятся функции получени списков текст. стилей разм.стилей итд. и все они будут использоваться в других программах.

Код:
[Выделить все]
И последнее  Я бы вставил обработчик ошибок все-таки
Ну а собственно и обрабатывать тут нечего только одно CMDECHO и то думаю и без него хорошо

Цитата:
Я буду все отрицать! [шутка]
Ваша функция занесена в отдельный файл, выложена в предыдущих топиках и отрицать чтото безполезно.
mmax вне форума  
 
Непрочитано 22.03.2006, 12:56
#159
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
Сообщение от mmax
Здесь я не буду ограничивать пользователя в фантазии, а вдруг ему действительно понадобится капуста.
Ну, дело хозяйское. Тогда придется корректно обрабатывать и отфонарный ввод - лишняя отладка... Кроме того, элементарный человеческий фактор -
Код:
[Выделить все]
            label = "Радиус наружной окружности";
            label = "Радиус внутренней окружности";
потом вдруг
Код:
[Выделить все]
            label = "Диаметр отверстий";
и снова
Код:
[Выделить все]
            label = "Расположение отверстий по радиусу";
эт придется мозги напрягать, чтоб радиус с диаметром нигде не попутать

Цитата:
Сообщение от mmax
Цитата:
2. Что будет, если диалог не найден (не найден файл диалога, диалог не загрузился и проч?)
Автокад должен сам с этим справиться.
В любом случае, надо сообщить пользователю что "по техническим причинам" прога дальше работать не будет... ну и корректно завершить ее...

Цитата:
Сообщение от mmax
Код:
[Выделить все]
И последнее  Я бы вставил обработчик ошибок все-таки
Ну а собственно и обрабатывать тут нечего только одно CMDECHO и то думаю и без него хорошо
Позволю себе не разделить Ваше мнение. Лично мне как то удобней с CMDECHO = 1 после отработки программы, если не возражаете.
vk вне форума  
 
Непрочитано 22.03.2006, 19:21
#160
favorite

инженер
 
Регистрация: 05.12.2005
Москва
Сообщений: 425


Скажити а как в функции ssget организовать фильтр, выбора блоков ну по их названиям.
favorite вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Я начинаю заниматься программированием LISP (help)