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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp.Непонятка с командой "-Boundary"

Lisp.Непонятка с командой "-Boundary"

Ответ
Поиск в этой теме
Непрочитано 12.05.2011, 12:24 #1
Lisp.Непонятка с командой "-Boundary"
getr
 
Конструктор
 
Из тех ворот-откуда весь народ.
Регистрация: 06.04.2005
Сообщений: 361

Попробовал сделать небольшой лисп для вычисления массы плоских деталей
(типа фасонок)..для определения контура использовал команду "-Boundary"...
все вроде считает правильно но есть одна непонятка,которую можно увидеть
в текстовом окне (F2)...
это сообщение автокада: "Unknown command "MDETPL".Press F1 for help."
Почему Unknown? Команда ведь выполняется!
Подозреваю что команде "-Boundary" чего то нехватает,но ЧЕГО?
Помогите разобраться (Автокад2005,eng),сам lisp знаю плохо
Код:
[Выделить все]
 (defun C:Mdetpl
       (/ cmdold osmodeold tol S V M pntv posl)
  (vl-load-com)

  (setq cmdold (getvar "cmdecho"))
  (setq osmodeold (getvar "osmode"))
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq pntv (getpoint "\nУкажите точку внутри контура плоcкой детали\n"))
;;; находим контур детали
 (command "_.-boundary" pntv "")
      (setq posl (entlast))
 (command "_Change" posl "" "_P" "_Color" "Red" """")

;;;теперь находим площадь контура
 (command "_AREA" "_o" posl)
      (setq S (/ (getvar "Area") 100))	; перевод площади в кв.см 
      (setvar "osmode" 136)
      (setq tol (getdist "\nТолщина плостой детали: "))

      (setq tol (/ tol 10))		;толщина в см 
      (setq V (* tol S))		;объем в куб.см 
      (setq M (* V 0.00785))		; масса в кг  
      (princ " Масса= ")
      (princ M)
      (princ "кг\n")
 (command "_.Erase" posl "")
      (setvar "cmdecho" cmdold)
      (setvar "osmode" osmodeold)

  (princ)
)					;end
P.S. Запускал лисп в ZWCADE сообщения "Unknown command "MDETPL".Press F1 for help." не было.
__________________
"Мнение не бывает ни истинным, ни ложным, а лишь полезным в жизни или бесполезным. ",- Ауробиндо
И не надо делать удивленных движений руками.

Последний раз редактировалось getr, 12.05.2011 в 17:41.
Просмотров: 2595
 
Непрочитано 12.05.2011, 19:06
#2
молодой человек


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


У меня никакой ошибки не выдаёт (ADT2008)
молодой человек вне форума  
 
Непрочитано 12.05.2011, 19:09
#3
Кулик Алексей aka kpblc
Moderator

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


А в zwCAD реализован ActiveX через лисп?
P.S. Код не проверял ни разу:
Код:
[Выделить все]
 (vl-load-com)

(defun c:mdtl (/ adoc *error* pt ent area sysvar_lst height)

  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (= (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 =
    (if (and (vl-cmdf "_.boundary" "_none" pt "")
             (not (vl-catch-all-error-p
                    (vl-catch-all-apply (function (lambda () (setq ent (vlax-ename->vla-object (entlast))))))
                    ) ;_ end of vl-catch-all-error-p
                  ) ;_ end of not
             (vlax-property-available-p ent 'area)
             (setq area (/ (vla-get-area ent) 100))
             ) ;_ end of and
      (progn
        (vla-erase ent)
        (if (= (type (setq height (vl-catch-all-apply
                                    (function
                                      (lambda ()
                                        (getdist "\nУкажите толщину детали, см <Отмена> : ")
                                        ) ;_ end of lambda
                                      ) ;_ end of function
                                    ) ;_ end of vl-catch-all-apply
                           ) ;_ end of setq
                     ) ;_ end of type
               'real
               ) ;_ end of =
          (progn
            (princ (strcat "\nМасса : "
                           (rtos (* height area 0.00785))
                           "кг"
                           "\nОбъем : "
                           (rtos (* height area))
                           "куб.см."
                           ) ;_ end of strcat
                   ) ;_ end of princ
            ) ;_ end of progn
          (princ "\nНе указана толщина детали")
          ) ;_ end of if
        ) ;_ end of progn
      (princ "\nНевозможно построить контур")
      ) ;_ end of if
    (princ "\nНе указана точка")
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 12.05.2011 в 19:21.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.05.2011, 00:20
#4
gomer

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


Тыкать нужно внутрь детали а не куда попало
gomer вне форума  
 
Автор темы   Непрочитано 13.05.2011, 09:16
#5
getr

Конструктор
 
Регистрация: 06.04.2005
Из тех ворот-откуда весь народ.
Сообщений: 361
<phrase 1=


Лисп Алексея работает нормально что в акаде что в Zwcade... а насчет "тыкать внутрь детали"-так ведь контур рисуется правильно..специально для контроля сделал ..да еще красным цветом...непонятно почему ругается что неизвестная команда и тут же ее выполняет.
->kpblc
Алексей, а как методами vla можно "подкрасить" контур для визуального контроля?
__________________
"Мнение не бывает ни истинным, ни ложным, а лишь полезным в жизни или бесполезным. ",- Ауробиндо
И не надо делать удивленных движений руками.

Последний раз редактировалось getr, 13.05.2011 в 15:09.
getr вне форума  
 
Непрочитано 14.05.2011, 10:44
#6
CB

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


Цитата:
Почему Unknown? Команда ведь выполняется!
Подозреваю что команде "-Boundary" чего то нехватает,но ЧЕГО?
Ошибка здесь:
Код:
[Выделить все]
(command "_Change" posl "" "_P" "_Color" "Red" "" "")
Нужно так:
Код:
[Выделить все]
(command "_Change" posl "" "_P" "_Color" "Red" "")
__________________
Никогда не спорьте с дураками - они опустят Вас до своего уровня и победят за счет опыта
CB вне форума  
 
Автор темы   Непрочитано 14.05.2011, 12:50
#7
getr

Конструктор
 
Регистрация: 06.04.2005
Из тех ворот-откуда весь народ.
Сообщений: 361
<phrase 1=


->CB
Спасибо.Cообщение об ошибке больше не появляется..надо же,- а я зациклился на -boundary...
-> Алексей
Со цветом нашел как сделать (vla-put-color ent 1)
А как можно границу заключить в переменную для дальнейших манипуляций.. вставка типа (setq boubd (entlast)) сразу за командой (vl-cmdf "_.boundary" "_none" pt "") ничего не дает
__________________
"Мнение не бывает ни истинным, ни ложным, а лишь полезным в жизни или бесполезным. ",- Ауробиндо
И не надо делать удивленных движений руками.
getr вне форума  
 
Непрочитано 16.05.2011, 08:30
#8
Кулик Алексей aka kpblc
Moderator

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


Почему ничего не дает? Может, просто граница не построена?
Ведь у меня именно на ее основе код и нарисован:
Код:
[Выделить все]
(and (vl-cmdf "_.boundary" "_none" pt "")
             (not (vl-catch-all-error-p
                    (vl-catch-all-apply (function (lambda () (setq ent (vlax-ename->vla-object (entlast))))))
                    ) ;_ end of vl-catch-all-error-p
                  ) ;_ end of not
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.05.2011, 15:37
#9
getr

Конструктор
 
Регистрация: 06.04.2005
Из тех ворот-откуда весь народ.
Сообщений: 361
<phrase 1=


Да скорей всего потому что не разбираюсь в vla (да и в лиспе постольку поскольку)...захотелось определять еще и массу деталей,имеющих контур вращения и решил объединить два лиспа-твой и еще не знаю чей,определяющий центр масс...извратился следующим способом
Код:
[Выделить все]
 ;******************************************* 
					; Mdet -программа определяет массу детали,имеющей форму тела вращения, в кг 
					;работает в пространстве модели
					;********************************************* 
(defun C:Mdet (/	 cmdold	   osmodeold kontur    pnt1
	       Radvr	 Skont	   massa     pdmodeold polyList
	       Model	 newPl	   obArr     newReg    newPt
	       adoc	 *error*   pntv	     ent       sysvar_lst
	      )
;;;часть кода слизанная у Алексея Кулика aka kpblc
 (vl-load-com)
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
  ) ;_ end of defun

  (setq cmdold (getvar "cmdecho"))
  (setq pdmodeold (getvar "pdmode"))
  (setq osmodeold (getvar "osmode"))
  (setvar "cmdecho" 0)

  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  )
  (if (= (type (setq pntv
		      (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 =
    (if
      (and
	(vl-cmdf "_.boundary" "_none" pntv "")
	(not
	  (vl-catch-all-error-p
	    (vl-catch-all-apply
	      (function	(lambda	()
			  (setq ent (vlax-ename->vla-object (entlast)))
			)
	      )
	    )
	  ) ;_ end of vl-catch-all-error-p
	) ;_ end of not
	(vlax-property-available-p ent 'area)
	(setq Skont (/ (vla-get-area ent) 100))
      ) ;_ end of and
       (progn
	 (vla-put-color ent 1)
       ) ;_ end of progn
       (princ "\nНевозможно построить контур")
    ) ;_ end of if
    (princ "\nНе указана точка")
  ) ;_ end of if


;;;*****************************************
  (princ
    "\n Укажите замкнутый образующий контур вращения:"
  )
  (if (eq nil (setq kontur (ssget ":S" '((0 . "lwpolyline")))))
    (progn
      (princ "*** Это не замкнутый образующий контур! ***\n"
      )
      (textscr)
      (princ)
    )
;;;;;;часть кода слизанная у неизвестно кого
    (progn
      (setvar "pdmode" 35)
      (setq polyList (mapcar 'vlax-ename->vla-object
			     ;; начало определение центра тяжести контура
			     (vl-remove-if
			       'listp
			       (mapcar 'cadr (ssnamex kontur))
			     )
		     )
	    Model    (vla-get-ModelSpace
		       (vla-get-ActiveDocument
			 (vlax-get-acad-object)
		       )
		     )
      )					; end setq 
      (foreach p polyList
	(if (= :vlax-true (vla-get-Closed p))
	  (progn
	    (setq newPl	(vla-copy p)
		  obArr	(vlax-make-safearray vlax-vbObject '(0 . 0))
	    )				; end setq 
	    (vlax-safearray-put-element obArr 0 newPl)
	    (setq newReg (car (vlax-safearray->list
				(vlax-variant-value
				  (vla-AddRegion Model obArr)
				)
			      )
			 )
		  newPt	 (vlax-3d-point
			   (append
			     (vlax-safearray->list
			       (vlax-variant-value
				 (vla-get-Centroid newReg)
			       )
			     )
			     (list 0.0)
			   )
			 )
	    )				; end setq 
	    (vla-AddPoint Model newPt)
	    (vla-delete newPl)
	    (vla-delete newReg)
	  )				; end progn 
	)				; end if 
      )					; end foreach 
;;;*******************************************************
;;;цетр тяжести контура определен
      (setvar "osmode" 136)
      (setq pnt1 (getpoint "\nУкажите цетр тяжести контура вращения\n"))
      (setq Radvr (getdist pnt1 "Укажите расстояние до оси вращения\n"))
      (setq Radvr (/ Radvr 10))		;радиус вращения в см 
      (setq massa (* 2.0 Pi Radvr Skont 0.00785)) ;масса в кг 
  (command "_.Erase" pnt1 "")
  (command "_.Erase" kontur "")
      (setvar "cmdecho" cmdold)
      (setvar "osmode" osmodeold)
      (setvar "pdmode" pdmodeold)
      (princ " Масса= ")
      (princ massa)
      (princ "кг")
    )					;progn     
  )					;if
  (vla-endundomark adoc)
  (princ)
)					;end
красным цветом собственно и есть мое художество,получилось коряво но работает...передать полилинию-границу сразу для вычисления ц.т. у меня как раз не вышло.
__________________
"Мнение не бывает ни истинным, ни ложным, а лишь полезным в жизни или бесполезным. ",- Ауробиндо
И не надо делать удивленных движений руками.
getr вне форума  
 
Непрочитано 17.05.2011, 03:51
#10
Кулик Алексей aka kpblc
Moderator

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


Попробуй так. Я добавил код для создания точки. Дальнейшая логика работы программы для меня - тайна
Код:
[Выделить все]
           ;******************************************* 
          ; Mdet -программа определяет массу детали,имеющей форму тела вращения, в кг 
          ;работает в пространстве модели
          ;********************************************* 
(defun c:mdet (/         cmdold    osmodeold kontur    pnt1      radvr     skont     massa     pdmodeold polylist
               model     newpl     obarr     newreg    newpt     adoc      *error*   pntv      ent       sysvar_lst
               )
;;;часть кода слизанная у Алексея Кулика aka kpblc
  (vl-load-com)
  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (setq cmdold (getvar "cmdecho"))
  (setq pdmodeold (getvar "pdmode"))
  (setq osmodeold (getvar "osmode"))
  (setvar "cmdecho" 0)

  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if (= (type (setq pntv
                      (vl-catch-all-apply
                        (function
                          (lambda ()
                            (getpoint
                              "\nУкажите точку внутри образующего контура детали <Отмена> : "
                              ) ;_ end of getpoint
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'list
         ) ;_ end of =
    (if
      (and
        (vl-cmdf "_.boundary" "_none" pntv "")
        (not
          (vl-catch-all-error-p
            (vl-catch-all-apply
              (function (lambda ()
                          (setq ent (vlax-ename->vla-object (entlast)))
                          ) ;_ end of lambda
                        ) ;_ end of function
              ) ;_ end of vl-catch-all-apply
            ) ;_ end of vl-catch-all-error-p
          ) ;_ end of not
        (vlax-property-available-p ent 'area)
        (setq skont  (/ (vla-get-area ent) 100)
              center (vla-addpoint
                       (vla-objectidtoobject (vla-get-activedocument (vlax-get-acad-object)) (vla-get-ownerid ent))
                       (vlax-3d-point
                         ((lambda (/ reg res)
                            (setq res (vlax-safearray->list
                                        (vlax-variant-value
                                          (vla-get-centroid
                                            (setq reg (car (vlax-safearray->list
                                                             (vlax-variant-value
                                                               (vla-addregion
                                                                 (vla-objectidtoobject
                                                                   (vla-get-activedocument (vlax-get-acad-object))
                                                                   (vla-get-ownerid ent)
                                                                   ) ;_ end of vla-ObjectIDToObject
                                                                 (vlax-safearray-fill
                                                                   (vlax-make-safearray vlax-vbobject '(0 . 0))
                                                                   (list ent)
                                                                   ) ;_ end of vlax-safearray-fill
                                                                 ) ;_ end of vla-AddRegion
                                                               ) ;_ end of vlax-variant-value
                                                             ) ;_ end of vlax-safearray->list
                                                           ) ;_ end of car
                                                  ) ;_ end of setq
                                            ) ;_ end of vla-get-Centroid
                                          ) ;_ end of vlax-variant-value
                                        ) ;_ end of vlax-safearray->list
                                  ) ;_ end of setq
                            (vla-erase reg)
                            res
                            ) ;_ end of lambda
                          )
                         ) ;_ end of vlax-3d-point
                       ) ;_ end of vla-addpoint
              ) ;_ end of setq
        ) ;_ end of and
       (progn
         (vla-put-color ent 1)
         ) ;_ end of progn
       (princ "\nНевозможно построить контур")
       ) ;_ end of if
    (princ "\nНе указана точка")
    ) ;_ end of if


;;;цетр тяжести контура определен
  (setvar "osmode" 136)
  (setq pnt1 (getpoint "\nУкажите цетр тяжести контура вращения\n"))
  (setq radvr (getdist pnt1 "Укажите расстояние до оси вращения\n"))
  (setq radvr (/ radvr 10)) ;радиус вращения в см 
  (setq massa (* 2.0 pi radvr skont 0.00785)) ;масса в кг 
  (command "_.Erase" pnt1 "")
  (command "_.Erase" kontur "")
  (setvar "cmdecho" cmdold)
  (setvar "osmode" osmodeold)
  (setvar "pdmode" pdmodeold)
  (princ " Масса= ")
  (princ massa)
  (princ "кг")
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.05.2011, 09:53
#11
getr

Конструктор
 
Регистрация: 06.04.2005
Из тех ворот-откуда весь народ.
Сообщений: 361
<phrase 1=


Логика простая:
1-имеется деталь с осью вращения(втулка ,ось,вал и т.п.),которая образуется вращением
контура вокруг этой оси(например-половинка сечения вала)
2-указываем точку внутри этого контура
3-получаем границу,подкрашиваем ее для визуального контоля
(чтобы убедиться что контур тот что нам нужен)
4-вычисляем площадь контура(S)
5-определяем центр тяжести контура(на чертеже появляется точка )
6-указываем расстояние от ц.т. до нашей оси вращения(R)
7-вычисляем массу как M=2*ПИ*R*S*0.00785
8-удаляем с чертежа точку=ц.т. и подкрашенный контур
Очень сильно экономит время приопределении массы деталей для указания в штампе.

P.S. Не заработал последний вариант..ругается bad argument value: AutoCAD command: #<VLA-OBJECT IAcadLWPolyline 077d3d84>
P.P.S. заменил 104 строку в лиспе на (command "_.Erase" (entlast) "") и заработало!УРА!Спасибо за помощь.
__________________
"Мнение не бывает ни истинным, ни ложным, а лишь полезным в жизни или бесполезным. ",- Ауробиндо
И не надо делать удивленных движений руками.

Последний раз редактировалось getr, 17.05.2011 в 13:55.
getr вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp.Непонятка с командой "-Boundary"



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
есть лисп файл. Какой командой его запустить? vladant LISP 6 08.02.2011 22:47
какой командой из делфи сделать активным окно уже запущенного Autocad2006? tinik_89 Программирование 5 19.01.2010 22:52
Проблемы с командой Align Space Rumata AutoCAD 3 05.10.2009 23:29
Как расчленить круг командой "explode"? alex2000 AutoCAD 11 16.08.2009 21:06
проблемы с командой find Mormon Разное 4 06.05.2008 17:32