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

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

Проблема извлечения площади примитива в CAD

Ответ
Поиск в этой теме
Непрочитано 05.06.2009, 13:19 #1
Проблема извлечения площади примитива в CAD
DEMOGOG
 
Регистрация: 05.06.2009
Сообщений: 15

При написании программ под AutoCAD я всегда пользовался для извлечения площади примитива и последующей манипуляцией ей следующим оборотом:
(command "_area" "_E" ent); где ent - имяпримитива
(setq ar (getvar "area"))
...
проблем никаких не испытывал.
Теперь возникла надобность подсунуть лиспы в InfrasoftCAD (поддержка у проги слабая, поэтому надеюсь получить здесь помощь), а там засада - после вышеуказанных строк CAD выдает примерно такое:
...
Объекты в наборе: 1
Выберете объекты:
Область = 8.4364 кв. единиц, Периметр = 11.8118ошибка: неразрешенная функция
(COMMAND "_area" "_E" ent)
...
дальше выплевывает остаток кода. Я предполагаю, что прерывает код сообщение "Область = 8.4364 кв. единиц, Периметр = 11.8118", хотя в классическом AutoCAD это сообщение глушится.

Вопрос к знающим людям следующий: может есть у кого мысли о решении этой проблемы (может кто уже сталкивался) или у кого какие способы извлечения площади примитивов (сразу предупреждаю: функции расширения лисп типа vla-get-area не канают)
Просмотров: 3851
 
Непрочитано 05.06.2009, 13:33
#2
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Выполнил такие выражения в InfrasoftCAD:
Код:
[Выделить все]
 
: _rectang
Фаска(Chamfer)/Повышение(Elevation)/Сопряжение(Fillet)/Повернутый(Rotated)/Квадрат(Square)/Толщина(Thickness)/Ширина(Width)/<Выбрать первый угол прямоугольника>: 
Другой угол прямоугольника: 
: (setq ent (entlast))
<Entity name: c461c28>
: (command "_area" "_E" ent)
nil
: _area
Объект(Entity)/Добавить(Add)/Вычесть(Subtract)/<Первая точка>: _E
Область = 1361.9421 кв. единиц, Периметр = 147.8905
Как видим, все сработало.
Profan вне форума  
 
Автор темы   Непрочитано 05.06.2009, 14:26
#3
DEMOGOG


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


В том-то и дело, я не говорил, что команда "area" не работает (строку типа "Область = 8.4364 кв. единиц, Периметр = 11.8118" выдает исправно), а то что после обращения к ней моя программа останавливается в аварийном режиме, а аналогичное обращение в AutoCAD к этому не приводит, а продолжает свою работу до конца.

Возможно я в первом посте неясно описал ситуацию.

Может еще есть какие предложения?
DEMOGOG вне форума  
 
Непрочитано 05.06.2009, 14:31
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


А переменная area есть?
что выдает (setq ar (getvar "area"))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 05.06.2009, 14:37
#5
DEMOGOG


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


возможно неверно истолковал ваш вопрос, поэтому 2 варианта ответа:
1 - в моем коде такой переменной не используется
2 - area - системная пременная

Последний раз редактировалось DEMOGOG, 05.06.2009 в 14:46. Причина: возможно неверно истолковал предыдущий вопрос
DEMOGOG вне форума  
 
Автор темы   Непрочитано 08.06.2009, 10:22
#6
DEMOGOG


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


Люди, может подскажет кто-нибудь еще способы извлечения площади примитива?
DEMOGOG вне форума  
 
Непрочитано 10.06.2009, 14:18
#7
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
Люди, может подскажет кто-нибудь еще способы извлечения площади примитива?
Вот здесь есть ну о-о-чень крутое решение.
http://www.caduser.ru/forum/index.ph...D=44&TID=36136
Supermax вне форума  
 
Автор темы   Непрочитано 10.06.2009, 18:12
#8
DEMOGOG


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


Штука интересная, но насколько мне известно, InfrasoftCAD с *.arx не дружит ((
DEMOGOG вне форума  
 
Непрочитано 10.06.2009, 18:21
#9
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


А почему ты не обращаешься сюда:
http://www.infrasoftcad.ru/forum/
Кстати, тему не мешало бы переименовать:
Проблема извлечения площади примитива в InfrasoftCAD

Последний раз редактировалось Profan, 10.06.2009 в 18:27.
Profan вне форума  
 
Автор темы   Непрочитано 11.06.2009, 09:39
#10
DEMOGOG


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


Официальная поддержка меня расстроила. Я звонил в службу технической поддержки в Москве, пытался выяснить элементарные вещи, также уточнить официальные сравнительные показатели по LISP в противовес AutoCAD, как это выложено, например, у zwCAD или BricsCAD на их оф. сайтах, там ответили мне, что они понятия не имеют. На вопрос: "где можно это выяснить", получил ответ: "если бы существовали такие данные, то мы обязательно знали бы" ))
DEMOGOG вне форума  
 
Непрочитано 11.06.2009, 09:45
#11
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


На мой взгляд, наилучшая поддержка Lisp сейчас реализована в ZWCAD. Я немного побаловался с InfrasoftCAD и решил, что стратегически на него не стоит делать ставку, как на альтернативу AutoCAD.
Profan вне форума  
 
Автор темы   Непрочитано 11.06.2009, 10:04
#12
DEMOGOG


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


Судя по цене InfrasoftCAD практически самый дешевый, поэтому вывод напрашивается сам собой. Наша организация юзает несколько лицензий AutoCAD и BricsCAD, с ними все ОК. Вообще подсунуть проги работающие под AutoCAD в zwCAD или BricsCAD не было никаких проблем, с менюхами пришлось только немного поразбираться. Под InfrasoftCAD попросили переделать ряд моих прог из дружественной организации, ни одна из них не пашет, проблема извлечения площади только вершина айсберга ((
DEMOGOG вне форума  
 
Непрочитано 11.06.2009, 10:06
#13
Ratmir


 
Регистрация: 12.09.2005
Барнаул
Сообщений: 77


Попробуй следущий код на Лиспе
-----------------------------------------------------------------
(setq inPoint (getpoint "\nУкажите точкой площадь: "));;end
(Command "_-boundary" inPoint "")
(setq Ree (entlast))
(Command "_area" "_E" Ree)
(setq areareal (getvar "area"))
(Command "_erase" "_L" "")
-----------------------------------------------------------------

Или используй утилиты RTools (бесплатные) посмотри на сайте dwg.ru (правда они тут уже старые) или на сайте (не реклама) http://www.zwcadsoft.ru/ в разделе СПДС
Ratmir вне форума  
 
Автор темы   Непрочитано 11.06.2009, 10:59
#14
DEMOGOG


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


Попробовал. Чем только отличается код, приведенный мной в начале темы, от этого? В AutoCAD Ваш код работает как и ожидалось отлично. В InfrasoftCAD после строки "(setq areareal (getvar "area"))" в командной строке появляется сообщение типа "Область = 8.4364 кв. единиц, Периметр = 11.8118ошибка: неразрешенная функция" и соответственно последняя строка Вашего кода не выполняется (Command "_erase" "_L" ""). Что приводит к аварийному останову любой проги, использующий подобный оборот ((
DEMOGOG вне форума  
 
Непрочитано 11.06.2009, 15:15
#15
Кулик Алексей aka kpblc
Moderator

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


Попробуй предварительно (перед (getvar "area")) установить menuecho и cmdecho в 0. Можно (для гарантии) - nomutt в 1. Не знаю, есть в InfrasoftCAD'e эти переменные или нет, но попробовать можно. Пара встречных вариантов:
Код:
[Выделить все]
(defun get-area1 (/ pt obj sysvar res)
  (if (setq pt (getpoint "\nУкажите внутреннюю точку <Отмена> : "))
    (progn
      (setq sysvar (mapcar
                     (function
                       (lambda (x)
                         (cons (car x) (getvar (car x)))
                         (setvar (car x) (cdr x))
                         ) ;_ end of lambda
                       ) ;_ end of function
                     '(("cmdecho" . 0)
                       ("menuecho" . 0)
                       ("nomutt" . 1)
                       ("osmode" . 0)
                       )
                     ) ;_ end of mapcar
            ) ;_ end of setq
      (command "_.-boundary" pt "")
      (setq obj (entlast))
      (command "_.area" "_e" obj)
      (setq res (getvar "area"))
      (command "_.erase" "_l" "")
      (mapcar (function (lambda (x)
                          (setvar (car x) (cdr x))
                          ) ;_ end of lambda
                        ) ;_ end of function
              sysvar
              ) ;_ end of mapcar
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun

(defun get-area2 (/ pt obj sysvar res)
  (if (setq pt (getpoint "\nУкажите внутреннюю точку <Отмена> : "))
    (progn
      (setq sysvar (mapcar
                     (function
                       (lambda (x)
                         (cons (car x) (getvar (car x)))
                         (setvar (car x) (cdr x))
                         ) ;_ end of lambda
                       ) ;_ end of function
                     '(("cmdecho" . 0)
                       ("menuecho" . 0)
                       ("nomutt" . 1)
                       ("osmode" . 0)
                       )
                     ) ;_ end of mapcar
            ) ;_ end of setq
      (command "_.-boundary" pt "")
      (setq obj (entlast))
      (command "_.area" "_e" obj)
      (setq res (getvar "area"))
      (while (/= (getvar "cmactive") 0)
        (command "")
        ) ;_ end of while
      (command "_.erase" "_l" "")
      (mapcar (function (lambda (x)
                          (setvar (car x) (cdr x))
                          ) ;_ end of lambda
                        ) ;_ end of function
              sysvar
              ) ;_ end of mapcar
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
Какой из них будет работать (и будет ли вообще) - не знаю.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.06.2009, 15:44
#16
DEMOGOG


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


Спасибо за отзывчивось, но по ходу с софтиной что-то не так. Так, если на этом примере показать:
(setq inPoint (getpoint "\nУкажите точкой площадь: "));;end
(Command "_-boundary" inPoint "")
(setq Ree (entlast))
(Command "_area" "_E" Ree)
(setq areareal (getvar "area"))
(Command "_erase" "_L" "")
После строки (Command "_area" "_E" Ree) выдается сообщение: "Область = 8.4364 кв. единиц, Периметр = 11.8118ошибка: неразрешенная функция" и код прерывается, а если добавить кавычки в конце (Command "_area" "_E" Ree ""), то за счет них после корректного извлечения площади появляется, например, диалоговое окно подгрузки приложений (это последняя команда которой я пользовался перед обращением к юзерской функции), нажимаю на нем ОК и код продолжается до своего логического завершения. Если пользовался перед этим командой redraw, то прога корректно работает )) Бред какой-то


Получилось!!!!
Проблеммная строка теперь выглядит вот так: (Command "_area" "_E" Ree "_redraw").
"_redraw" - первое простое, что на ум пришло.
Получается, что Command "_area" жаждет активного своего завершения ))


Всем спасибо за участие!
Теперь буду дальше ковырять InfrasoftCAD, что-то там не так в восприятии типов переменных, позже отпишусь

Последний раз редактировалось DEMOGOG, 11.06.2009 в 15:55.
DEMOGOG вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проблема извлечения площади примитива в CAD

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12