Тема: Определение площади в Га

Это не вопрос-это проба пера :)
Родилось сие после того как меня попросили вписать на план местности площади 125 отдельных участков...
Собственно оно:

(defun C:ahap()
    ;Частично сохраняем окружение и устанавливаем обработчик ашипок :)
    (setq om  (getvar "orthomode")
             osm (getvar "osmode")
             TS   (getvar "textstyle")
             olderr *error*
             *error* ashipka
    );setq
    ;Устанавливаем свои
    (setvar "orthomode" 0);Выключаем режим ортогональности
    (setvar"osmode" 0);Выключаем все привязки
    (command "_.style" "aha" "arial.ttf" "0" "1" "0" "N" "N");Устанавливаем новый стиль текста
    (while ;Начинаем цикл определения и вставки в чертеж значений площади в Га
      (setq a (getpoint "\nВыберите внутреннюю точку: "))
      (command "_.-Boundary" a "");Получаем замкнутый контур
      (setq b (entlast))
      (redraw b 3);Подсвечиваем его(отсутствие подсветки в комманде AREA меня бесит)
      (command "_.area" "O" "L")
      (setq PLO (rtos (/ (getvar "area") 10000.0) 2 2));Полученное значение площади переводим в Га
      (setq TI (getpoint "\nУкажите точку вставки текста <auto>"))
      (if (= TI nil)(setq TI a))
      (command "_.text" TI "8" "0" (strcat PLO "Ha"));Вставляем его в чертеж
      (redraw b 2);Стираем, уже ненужный контур
      (entdel b);Удаляем, уже ненужный контур
    );while
    ;Возвращаемся к исходным настройкам
    (command "_.style" TS)
    (while (= 1 (logand (getvar "CMDACTIVE") 1)) (command ""));Цикл вставлен для подавления вопросов комманды TEXT
    (setvar "orthomode" om)
    (setvar "osmode" osm)
    (setq TL nil
    TI nil
    TS nil)
    (princ)
);defun C:ahap()
;Обработка ошибок
(defun ashipka (s)
      (if (/= s "Function cancelled")
          (princ (strcat "\nError: " s))
      );if
      (command "_.style" TS)
      (while (= 1 (logand (getvar "CMDACTIVE") 1)) (command ""))
      (setq *error* olderr)
      (setvar "orthomode" om)
      (setvar "osmode" osm)
      (command
               "redrawall"
      );command
);defun ashipka (s)
(princ)

ЗЫ. Ногами не бить. За замечания буду искренне благодарен.

Re: Определение площади в Га

В комманде  boundary  ашипка :), правда на 14, на других не знаю, должно быть
(command "_.-Boundary" a "y" "") ,  а в остальном, прекрасная  маркиза, всё хорошо, всё хорошо :), мне понравилось

Re: Определение площади в Га

Верю, но не могу, к сожалению, проверить на 14:). На  2004 все работает. Может кто проконсультирует как это дело побороть гарантированно?

Re: Определение площади в Га

Дополнение:
Можно обойтись и без (command "_.text".....
Вместо нее вставить эти операторы(после (if (= TI nil)(setq TI a))):

    ;Инициализация переменных для создания метки через ENTMAKE
    (setq cmd (cons 0 "TEXT"); Имя примитива
    pt0 (list 10 0.0 0.0 0.0); Первая точка выравнивания(пересчитывается Автокадом автоматически?)
    hght (cons 40 8.0); Высота текста
    numga (cons 1 (strcat PLO "Ha")); Текст
    txtgn (cons 71 0); Способ отображения текста
    hjust (cons 72 1); Горизонтальное выравнивание
    pt2 (cons 11 TI); Точка вставки(Вторая точка выравнивания)
    vjust (cons 73 2) Вертикальное выравнивание
    );setq
    (entmake (list cmd pt0 hght numga txtgn hjust pt2 vjust)); Создаем метку

..... так длиннее, но мне нравиться больше :)

Re: Определение площади в Га

.....упс, забыл про стиль.

(setq.....)
.........
styl (cons 7 "aha"); Стиль текста
.........
.........
.........
);setq
(entmake (list cmd styl pt0 hght numga txtgn hjust pt2 vjust)); Создаем метку

Re: Определение площади в Га

Окончательный(для моих нужд) вариант:
;**********************************************************************************************
;Функция определения площади замкнутого контура с выбором через указание внутренней точки
;**********************************************************************************************
(defun entmktext(ar / cmd styl pt0 hght numha txtgn hjust pt2 vjust);Формирование списка для создания метки
    (setq cmd (cons 0 "TEXT"); Имя создаваемого примитива(однострочный текст)
    styl (cons 7 "aha"); Стиль текста
    pt0 '(10 0.0 0.0 0.0); Первая точка выравнивания(фиктивные данные)
    hght (cons 40 8.0); Высота текста
    numga (cons 1 (strcat ar "Ha")); Текст
    txtgn (cons 71 0); Способ отображения текста
    hjust (cons 72 1); Горизонтальное выравнивание
    pt2 '(11 0.0 0.0 0.0); Точка вставки(Вторая точка выравнивания(фиктивные данные))
    vjust (cons 73 2) ;Вертикальное выравнивание
    entlist (list cmd styl pt0 hght numga txtgn hjust pt2 vjust)
    );setq
entlist);entmktext
(defun entins(lst);Вставка метки в чертеж
    (while(= nil (setq ti (getpoint "\nУкажите точку вставки метки:"))))
    (setq lst (subst (cons 10 ti) (assoc 10 lst) lst)); Подстановка координат точки вставки в список
    (setq lst (subst (cons 11 ti) (assoc 11 lst) lst))
    (setq ent (entmake lst)); Создание метки
ent);entins
(defun mkframe(ent / box); Художественное оформление текста :)
(progn
    (setq box (textbox ent))
    (entmake (list (cons 0 "CIRCLE") (cons 10 (cdr (assoc 11 ent))) (cons 40 (* 0.5 (distance (cadr box) (car box))))))
    (entmake (list (cons 0 "CIRCLE") (cons 10 (cdr (assoc 11 ent))) (cons 40 (* 0.55 (distance (cadr box) (car box))))))
);progn
);mkframe
(defun getboundary(/ a); Получаем замкнутый контур
    (while (= nil (setq a (getpoint "\nВыберите внутреннюю точку: "))))
    (command "_.-Boundary" a "")
    (setq b (entlast))
b);defun getboundary()
(defun toha(ar);Значение площади переводим в Га
    (setq plo (rtos (/ ar 10000.0) 2 2));
plo);toha
(defun C:ahap ()
  ;Частично сохраняем окружение и устанавливаем обработчик ашипок :)
  (setq om  (getvar "orthomode")
           osm (getvar "osmode")
           ts   (getvar "textstyle")
           olderr *error*
           *error* ashipka
  );setq
  ;Устанавливаем свои
  (setvar "orthomode" 0);Выключаем режим ортогональности
  (setvar"osmode" 0);Выключаем все привязки
  (command "_.style" "aha" "arial.ttf" "0" "1" "0" "N" "N");Устанавливаем новый стиль текста
  (while ;Начинаем цикл определения и вставки в чертеж значений площади в Га
    (progn
    (setq b (getboundary)); Создаем........
    (redraw b 3); ......и подсвечиваем замкнутый контур(отсутствие подсветки в комманде AREA меня бесит)
    (command "_.area" "O" "L"); Вычисляем площадь
    (setq ar (getvar "area"))
    (mkframe (entins (entmktext (toha ar))));Создаем метку и вставляем в чертеж(с оформлением)
    (redraw b 2);Стираем, уже ненужный контур
    (entdel b);Удаляем, уже ненужный контур
    );progn
  );while
  ;Возвращаемся к исходным настройкам
  (command "_.style" TS)
  (while (= 1 (logand (getvar "CMDACTIVE") 1)) (command ""));Цикл вставлен для подавления вопросов комманды TEXT
  (setvar "orthomode" om)
  (setvar "osmode" osm)
  (setq TL nil
  TI nil
  TS nil)
  (princ)
);defun C:ahap()
;Обработка ошибок
(defun ashipka (s)
(command nil nil nil)
      (if (not
    (member (strcase s) ' ("CONSOLE BREAK" "FUNCTION CANCELLED"))
           )
         (princ (strcat "\nError: " s))
      );if
      (command "_.style" TS)
      (while (= 1 (logand (getvar "CMDACTIVE") 1)) (command ""))
      (setq *error* olderr)
      (setvar "orthomode" om)
      (setvar "osmode" osm)
      (command
               "redrawall"
      );command
);defun ashipka (s)
(princ)

Re: Определение площади в Га

Сюда будем добавлять? http://www.autocad.ru/docs/

Re: Определение площади в Га

> den-si
Не возражаю :)