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

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

Задачка для программиста

Ответ
Поиск в этой теме
Непрочитано 15.01.2004, 03:06 #1
Задачка для программиста
Victor_G
 
Инженер-строитель-студент
 
Петрозаводск
Регистрация: 15.01.2004
Сообщений: 12

Господа Автолисперы! Такая встала задача: если имеется контур стен (линии) с проемами для дверей, то как побыстрее выцепить площадь комнаты? Конкретнее - я тыкаю мышкой в _закрытую_ область -> получаю площадь, тыкаю в комнату - boundary ругается на дверь. Какие будут предложения?
Просмотров: 5042
 
Непрочитано 15.01.2004, 11:14
#2
Alxd


 
Сообщений: n/a


Сомневаюсь я, что тут лиспом можно обойтись. Мне почему-то сразу приходит на ум arx. Хотя и там сходу не скажу как сделать.
Задачка интересная!
 
 
Непрочитано 15.01.2004, 13:15
#3
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


Может это подойдет?
Код:
[Выделить все]
(defun C:Ploshad ( / l1 p1 p2 p3 p4 t1 s1 )
;global ploshad0 - точность расчета
(if (not ploshad0)(setq ploshad0 2))
(while (not p1)
   (setq p1 (getpoint (strcat "\nПервая точка или <точность (=" (itoa ploshad0) ")>:")))
   (if (not p1)(setq ploshad0 (InputV "Знаков после точки" ploshad0))))
(setq l1 (list p1))
(initget 1)(setq p1 (getpoint "\nВторая точка:"))
(while p1
   (setq l1 (cons p1 l1) p1 (getpoint "\nСледующая точка <завершить>:")))
(if (= (length l1) 2)
   (setq p1 (car l1) p2 (cadr l1) p3 (list (car p2)(cadr p1))
         p4 (list (car p1)(cadr p2)) l1 (list p1 p3 p2 p4)))
(apply 'command (append (list "_area") l1 (list "")))
(setq t1 (* (getvar "area")(getvar "dimlfac")(getvar "dimlfac") 1e-06)
      t1 (rtos t1 2 ploshad0))
(if (setq p1 (getpoint (strcat "\n \nТочка для " t1 " м.кв. или <пропустить>:")))
   (progn (setq s1 (ssget "c" (Dxy p1 -2 -1)(Dxy p1 2 1)))
          (setvar "cmdecho" 0)
          (if s1 (command "_erase" s1 ""))
          (command "_text" "_m" p1 "" "" t1)))
(princ));c:Ploshad

(defun Dxy (p1 v1 v2)(list (+ (car p1) v1)(+ (cadr p1) v2)));Dxy

(defun InputV (tit def / v1 v2 t1)
(princ "\n")(princ tit)(princ " <")(princ def)(princ ">:")
(setq v1 (type (if input0 input0 def))
      input0 nil
      v2 blank0
      blank0 nil
      t1 (cond ((= v1 'real)(getreal))
               ((= v1 'int) (getint))
               ((= v1 'str) (getstring v2))))
(if (or (= t1 "")(not t1)) def t1));InputV
Тут если помещение прямоугольное - то достаточно указать точки двух диагональных углов. Если сложной формы - то обежать точками по кругу по всем углам. В конце можно написать полученное значение в кв.метрах прямо на чертеже.
Учитывается текущий масштаб (переменная dimlfac).
Ограничение: Поразумевается, что 1 у.е. Акада = 1 мм.
Pilot вне форума  
 
Автор темы   Непрочитано 19.01.2004, 03:02
#4
Victor_G

Инженер-строитель-студент
 
Регистрация: 15.01.2004
Петрозаводск
Сообщений: 12


программа хорошая, работает, но изначально идея была другой. Чтобы не выделять каждый угол многоугольника, а тыкнуть мышей в замкнутую область.
Попробуйте это:
Цитата:
(defun c:counter (/ sum_area)
;(setvar "cmdecho" 0) ;выключает эхо команд
(setq sum_area 0) ;обнуляет значение суммарной площади

(command "-boundary" "a" "i" "n" "n" "" pause "") ;рисует полилинию по замкнутому контуру в экране
(setq polyline1 (entlast)) ;определяет переменныю как последний созданный объект
(command "_area" "o" polyline1) ;подсчитывает площадь полилинии
(command "_erase" polyline1 "") ;стирает ненужную полилинию
(setq sum_area (+ sum_area (getvar 'area)))
;подсчитывает общую площадь
;теперь надо всю эту хрень закатать в цикл с
;подсчетом площади для каждой области
;(в переменную areaN)
;и суммированием в переменной sum_area
(setq text_sum_area (* 0.000001 sum_area)) ;представляет площадь в м2
(setq text_sum_area (rtos text_sum_area 2 2))
;оставляет два знака после запятой
(setq old_osmode (getvar 'osmode))
(setvar "osmode" 0)
(command "_line" "-550,-100" "@1100,0" "")
(setq line (entlast))
(command "-text" "j" "c" "0,0" "200" "0" text_sum_area) ;пишет текст
(setq text (entlast))
(command "_move" text line "" "750,-300" pause)
(setvar "osmode" old_osmode)
(setvar "cmdecho" 1)
)
Хотелось бы эту программу использовать в полевых условиях, но этому мешают две вещи:
-в каждом помещении есть дверь, которая по ГОСТ рисуется открытой. boundary это не поймет...
-чертеж заполнен всякими линиями типа осей, которые делят искомую область на более мелкие - тоже надо как-то обойти.
Как - пока не ясно.
Victor_G вне форума  
 
Непрочитано 19.01.2004, 10:14
#5
Apelsinov

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


Посмотрите на http://www.apelsi.narod.ru/AREA1.LSP
Apelsinov вне форума  
 
Непрочитано 19.01.2004, 11:02
#6
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


Цитата:
Сообщение от Victor_G
Хотелось бы эту программу использовать в полевых условиях, но этому мешают две вещи:
-в каждом помещении есть дверь, которая по ГОСТ рисуется открытой. boundary это не поймет...
-чертеж заполнен всякими линиями типа осей, которые делят искомую область на более мелкие - тоже надо как-то обойти.
Как - пока не ясно.
Обойти это можно, если оси рисовать на слое "ОСИ", а линии, замыкающие открытые двери, на слое "ВСПОМОГАТЕЛЬНЫЙ", не выводящийся на печать.
А в начало проги добавить отключение этих слоев, в конце проги - включение.
Torino вне форума  
 
Автор темы   Непрочитано 19.01.2004, 21:12
#7
Victor_G

Инженер-строитель-студент
 
Регистрация: 15.01.2004
Петрозаводск
Сообщений: 12


2Apelsinov: очень приятно выделяются области оранжевым цветом, красиво. А если внутри области есть объект, площадь которого не следует учитывать?
2Torino: оси уже на слое "ОСИ", а линий зымыкания дверей нет вообще. В таком случае надо оформлять программку отрисовки дверей с заданными условиями (чтобы вспомогательные линии были на отдельном слое). А надо ли это вообще? Потому что есть к примеру ADT2004, с функцией area. В смысле программа уже написана - и зачем изобретать велосипед? Разве что из любви к исскуству...

Из любви такой вопрос: мы все (и в теме "Lisp к boundary") пользуемся командой area для определения площади, а затем считываем системную переменную с одноименным названием. А можно ли как-то выцепить площадь (и периметр) из свойств созданного объекта?[/url]
Victor_G вне форума  
 
Непрочитано 20.01.2004, 01:44
#8
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


(vl-load-com)
(setq vla_obj (vlax-ename->vla-object obj)); преобразование обычного примитива в VLA объект (ActiveX)
(setq ar (vla-get-area vla_obj)); извлечение свойства area

Перед извлечением свойства area недурно проверить его наличие у объекта функцией (vlax-property-available-p vla_obj "area"). Эта краказябра возвратит T если свойство есть.
{Smirnoff} вне форума  
 
Непрочитано 20.01.2004, 11:22
#9
Apelsinov

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


Цитата:
Сообщение от Victor_G
А если внутри области есть объект, площадь которого не следует учитывать?
Задачка интересная, но как это реализовать - я не знаю. То есть хотелось бы сделать так - указываешь один контур, затем следующий, если они перекрываются - то из внешнего вычитается внутренний, если нет, то они суммируются. Но как выявить перекрываются ли они?
Можно еще при отрисовке boundary задать выделение внутренних областей, и затем из внешнего вычитать все внутренние, но тогда как быть, если необходимо получить полную площадь, с учетом внутренних, придется к программе писать еще и настройки, и в них указывать - учитывать внутренние или нет. Но это усложнит прогу и работу с ней.
Еще можно, конечно, вставить диалог на обозначение не учитываемых областей. - опять усложнение работы с программой. легче просто вычесть потом площадь внутреннего обьекта.
Так какой из способов предпочтительней?
Еще, кстати, замечу, что для меня эта задачка чисто академическая, т.к. для проставления площадей я использую СПДС grafics. Единственное, для чего использую эту прогу - это именно подсчет площадей, разница как между DIST и DIMLINEAR.
P/S И еще вопрос знающим, почему-то прога некорректно работает при загрузке через startup suite. в остальных случаях нормально.
Apelsinov вне форума  
 
Непрочитано 20.01.2004, 13:27
#10
lee


 
Сообщений: n/a


ADT
 
 
Автор темы   Непрочитано 22.01.2004, 08:50
#11
Victor_G

Инженер-строитель-студент
 
Регистрация: 15.01.2004
Петрозаводск
Сообщений: 12


2Apelsinov: при определении площади создается полилиния; можно у нее выцепить координаты вершин, и, если одна область внутри другой, то какая-нибудь координата внутренней области стопудово попадет в промежуток координат внешней (отдельно по X, Y). Ммм?
А вопрос по координатам уже гдето здесь был...

P.S Знающие люди, посоветуйте как сдать динамику и устойчивость, второй раз валится!
Victor_G вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Задачка для программиста

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

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