Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

VVA, можно ли сделать чтоб площадь вставляемая в указанную точку рисунка подчеркивалась полилинией, длина ее - по границам поля, растояние от текста - 100 ?
Это нужно для проставления площади помещений, и подчеркивать нужно обязательно "жирной" линией, сочетание Ctrl+U не подходит.
LISP. Вставка в таблицу поля, соотвествующего площади примитива

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

А нет чего либо подобного но без привязки к (FIELD), просто текст?

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

Valery Brelovsky, Если и нет, то никогда не поздно создать. По примеру PTLB

(defun C:PTLB1 ( / en cmdname fld txt fc tblset tblobj row col pt
                 whatAcadVer tstyle what)
;  Команда: PTLB1
;  Эта команда позволяет вставить в указанную точку рисунка или указанную ячейку таблицы
;  текст, содержащий значение площади или длины построенного или выбранного контура.
;  Точность округления и масштабный коэффициент настраиваются через опцию Установки
;  Код можно сохранить в файле ptlb1.lsp
;  Возможный макрос для кнопки или пункта меню:
;  ^C^C(if (not C:PTLB1) (load "ptlb1"));PTLB1;
;; Вариант макроса для задания м2
;; ^C^C(if (not C:PTLB1) (load "ptlb1"));PTLB1;_L;_S;1;0.001;2;5;;м2;
;;Где
;; _L - считать длинну (_A - площадь)
;; _S - установки
;; 1 - линейный масштабный коэффициент
;; 0.001 — площадной масштабный коэффициент
;; 2 — точность округления
;; 5 — высота текста
;; префикса нет
;; м2 - суффикс
  
;;;Ф-ция возвращает версию Автокада ввиде 2004 2005 2006 2007 2008
(defun whatAcadVer ( / Aver)
  ;;;Ф-ция возвращает версию Автокада ввиде 2004 2005 2006 2007 2008 2009

(setq Aver (atof (substr (getvar "ACADVER") 1 4)))
(cond
((= Aver 18.0) 2010)  
((= Aver 17.2) 2009)
((= Aver 17.1) 2008)
((= Aver 17.0) 2007)
((= Aver 16.2) 2006)    
((= Aver 16.1) 2005)
((= Aver 16.0) 2004)
((= Aver 15.06) 2002)
(t 0)
)
)
  (vl-load-com)
  (or *SCALEL* (setq *SCALEL* 1))
  (or *SCALEA* (setq *SCALEA* 1))
  (or *PREC* (setq *PREC* 2))
  (or *TEXTSIZE* (setq *TEXTSIZE* (getvar "TEXTSIZE")))
  (or *SUFF* (setq *SUFF* ""))(or *PREF* (setq *PREF* ""))
  (setq *SUFF* (vl-princ-to-string *SUFF*))
  (setq *PREF* (vl-princ-to-string *PREF*))
  (and
    (or ;_ > Проверяем версию
      (> (whatAcadVer) 2005)
      (alert "\nНужен Автокад версии 2006 и выше")
      ) ;_ < Проверяем версию
    (or (initget "Length Area Длина Площадь _Length Area Length Area") t)
    (if (null (setq what (getkword "\nЧто будем считать [Длина/Площадь] <Длина> :")))
      (setq what "Length") t)
      (princ "\nТекущий масштаб: линейный = ")(princ *SCALEL*)(princ " площадной = ")(princ *SCALEA*)
      (princ " Текущая точность округления = ")(princ *PREC*)
      (princ " Высота текста = ")(princ *TEXTSIZE*)
      (princ " Префикс= ")(princ *PREF*)(princ " Суффикс= ")(princ *SUFF*)
    (or
      (initget "Polyline Setting sElect Полилиния Установки Выбор _Polyline Setting sElect Polyline Setting sElect")
      t
      )
    (or ;_ > Запрашиваем что рисовать + опции
    (while (= (setq cmdname (getkword (strcat (if (= what "Area") "\n<Площадь> " "\n<Длина> ")
           "Выберите или нарисуйте [Полилиния/Установки/Выбор] <Выбор>: ")))
              "Setting")
      (princ "\nНовый линейный масштабный коэффициент <")(princ *SCALEL*)(princ "> : ")
      (initget 6)
      (if (setq en (getdist))(setq *SCALEL* en))
      (princ "\nНовый площадной масштабный коэффициент <")(princ *SCALEA*)(princ "> : ")
      (initget 6)
      (if (setq en (getdist))(setq *SCALEA* en))
      (princ "\nТочность округления <")(princ *PREC*)(princ "> : ")
      (initget 4)
      (if (setq en (getint))(setq *PREC* en))
      (princ "\nВысота текста <")(princ *TEXTSIZE*)(princ "> : ")
      (initget 6)
      (if (setq en (getdist))(setq *TEXTSIZE* en))
      (princ "\nПрефикс (пробел - очистить) <")(princ *PREF*)(princ "> : ")
      (setq en (getstring t))(if (= en "")(setq en *PREF*))
      (if (= en " ")(setq en ""))
      (if (= (substr (vl-string-left-trim "\/" en) 1 2) "U+")
      (setq en (strcat "\\" (vl-string-left-trim "\/" en))))(setq *PREF* en)
      (princ "\nСуффикс (пробел - очистить) <")(princ *SUFF*)(princ "> : ")
      (setq en (getstring t))(if (= en "")(setq en *SUFF*))
      (if (= en " ")(setq en ""))
      (if (= (substr (vl-string-left-trim "\/" en) 1 2) "U+")
      (setq en (strcat "\\" (vl-string-left-trim "\/" en))))(setq *SUFF* en)
      (initget "Polyline Setting sElect Полилиния Установки Выбор _Polyline Setting sElect Polyline Setting sElect")
      )
    t
    ) ;_ < Запрашиваем что рисовать + опции
  (cond
    ((= cmdname "Polyline")(setvar "CMDECHO" 1)(command "_.PLINE")
     (while (> (getvar "CMDACTIVE") 0)(command pause))
     (setq en (entlast))
     )
    ((or (null cmdname)(= cmdname "sElect"))
         (princ "\nВыберите полилинию, круг, сплайн, эллипс или дугу")
         (and
           (setq tblset (ssget "_:S:E" (if (= what "Area") '((0 . "*POLYLINE,ARC,SPLINE,ELLIPSE,CIRCLE"))
                                                           '((0 . "LINE,*POLYLINE,ARC,CIRCLE")))
                                         ))
           (setq en (ssname tblset 0))
           )
     )
    (t nil)
    )
  ;_ Формируем поле
  (cond
    ((= what "Area")
     (setq fld (vlax-curve-getArea (vlax-ename->vla-object en)))
     (setq fld (* fld *SCALEA*))
     (setq fld (rtos fld 2 *PREC*))
     (setq fld (strcat *PREF* fld *SUFF*))
;;;     (setq fld (strcat "%<\\AcObjProp Object(%<\\_ObjId "
;;;             (vl-princ-to-string(vla-get-objectid ))
;;;                ">%).Area \\f \"%lu2%ps["*PREF* "," *SUFF*
;;;                "]%pr"(itoa *PREC*) "%ct8["(vl-princ-to-string *SCALEA*)"]\">%"
;;;                ) ;_ strcat
;;;          ) ;_ setq
     )
    ((= what "Length")
     (setq fld (vlax-curve-getDistAtParam
                 (vlax-ename->vla-object en)
                 (vlax-curve-getEndParam (vlax-ename->vla-object en))
                 )
           )
     (setq fld (* fld *SCALEL*))
     (setq fld (rtos fld 2 *PREC*))
     (setq fld (strcat *PREF* fld *SUFF*))
     )
    (t (setq fld "Неизвестное свойство"))
    )
(setvar "cmdecho" 0)
(setq tstyle (getvar "TEXTSTYLE")) ;_Стиль текста Стиль должен существовать
    ;_ Создаем текст
(if (= (cdr (assoc 40 (tblsearch "STYLE" tstyle))) 0.0)
     ;; нулевая высота текста
   (vl-cmdf "_.-TEXT" "_S" tstyle "_none" '(0 0 0) *TEXTSIZE* 0 fld)
   (vl-cmdf "_.-TEXT" "_S" tstyle "_none" '(0 0 0) 0 fld)
   ) ;_ end of if
    (setq txt (entlast))
  ;_ Копируем в буфер и обратно
  (princ "\n Укажите точку вставки текста или ячейку таблицы:")
  (vl-cmdf "_.copybase" (trans '(0 0 0) 0 1) txt "" "_.erase" txt "" "_.pasteclip" "_none" pause)
  ;_ В txt примитив текста в pt точка вставки  
  (setq txt (entlast) pt (getvar "LASTPOINT"))
  (or
    (and ;_Проверяем, попала ли точка в ячейку таблицы
      (setq  tblobj nil tblset (ssget "_X" '((0 . "ACAD_TABLE"))))
      (setq lst (mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr (ssnamex tblset)))))
      (mapcar '(lambda (x)
           (or tblobj
               (and
                 (= :vlax-true (vla-HitTest x
                               (vlax-3d-point (trans pt 1 0))
                               (vlax-3d-point (trans (getvar "VIEWDIR") 1 0))
                               'row 'col))
                 (setq tblobj x)
                 )
               )
           )
        lst)
      tblobj row col
      (or (vla-SetText tblobj row col fld) t)
      (entdel txt)
      )
    (and ;_Не попала, рисуем текст с полем
      (setq txt (vlax-ename->vla-object txt))
      (vlax-write-enabled-p txt)
      (vlax-method-applicable-p txt 'FieldCode) ;_есть метод FieldCode
      (vlax-property-available-p txt 'TextString)
      (vlax-put txt 'TextString fld)
      )
    )
  )
  (princ)
  )

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

Владимир Азарко,
Что то я закрутился. И пропустил столько времени. Придется нагонять.
ПОпробовал в 2000. Что то не пошла.
Command: ; error: syntax error

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

Valery Brelovsky пишет:

Владимир Азарко, 
Что то я закрутился. И пропустил столько времени. Придется нагонять.
ПОпробовал в 2000. Что то не пошла.
Command: ; error: syntax error

посмотрите код:
(setq Aver (atof (substr (getvar "ACADVER") 1 4)))
(cond
((= Aver 18.0) 2010)   
((= Aver 17.2) 2009)
((= Aver 17.1) 2008)
((= Aver 17.0) 2007)
((= Aver 16.2) 2006)     
((= Aver 16.1) 2005)
((= Aver 16.0) 2004)
((= Aver 15.06) 2002)

2000-й не поддерживает

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

Не то чтобы не поддерживает. Я не знаю, что в 2000 возвращает  (getvar "ACADVER"). Я в свое время как то 2000-й пропустил. Перешел с 14 сразу на 2002.

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

Если не изменяет память, то 15.0, хотя сравнивать (да еще на "=") плавающие числа... Да и в AutoCAD 2000 полей еще не было...

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

А возможно ли чтобы лисп записывал высоту 3д тела в таблицу, и значение таблицы также менялось с изменением высоты 3д тела?

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

Al пишет:

А возможно ли чтобы лисп записывал высоту 3д тела в таблицу

Нет. Нет такого свойства.

(изменено: klopius, 12 ноября 2009г. 16:28:41)

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

ну как же какже ...
3д тело ресуем так:
1. начертили допустим квадратик
2. выдавили его екструдом
3. жамкаем ктрл+1
4. смотрим внимательно в закладке геометрия, значения высоты.
(пользуюсь  автосадом 2009)

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

Вот все свойства, которые могут быть использованы в поле для объекта 3DSOLID:

LISP. Вставка в таблицу поля, соотвествующего площади примитива

Найди среди них высоту (height). smile Вопросы еще есть? Если вопрос "почему в панели свойств есть такое свойство, а для FIELD нет" - то адресуй его в Autodesk.

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

LISP. Вставка в таблицу поля, соотвествующего площади примитива
может тут где посмотреть?
или в истории ...
...
или в разности по осям координат (нижняя верхняя граница)
команда же list берет же от кудато значения..
LISP. Вставка в таблицу поля, соотвествующего площади примитива

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

Мы на одном языке говорим? Смотреть ты можешь где угодно. Хоть в панели свойств. Но в ячейку таблицы поле, которое бы содержало высоту ящика, и которое бы обновлялось, ты вставить не сможешь.

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

- Мы на одном языке говорим?   -да
- Смотреть ты можешь где угодно. Хоть в панели свойств. Но в ячейку таблицы поле, которое бы содержало высоту ящика, и которое бы обновлялось, ты вставить не сможешь.  - ну чтож, будем искать обходной путь

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

[B пишет:

Владимир Азарко [/B]]
 

(defun C:PTLB1 ( / en cmdname fld txt fc tblset tblobj row col pt 
                 whatAcadVer tstyle what) 
;  Команда: PTLB1 
;  Эта команда позволяет вставить в указанную точку рисунка или указанную ячейку таблицы 
;  текст, содержащий значение площади или длины построенного или выбранного контура. 
;  Точность округления и масштабный коэффициент настраиваются через опцию Установки 
;  Код можно сохранить в файле ptlb1.lsp 
;  Возможный макрос для кнопки или пункта меню: 
;  ^C^C(if (not C:PTLB1) (load "ptlb1"));PTLB1; 
;; Вариант макроса для задания м2 
;; ^C^C(if (not C:PTLB1) (load "ptlb1"));PTLB1;_L;_S;1;0.001;2;5;;м2; 
;;Где 
;; _L - считать длинну (_A - площадь) 
;; _S - установки 
;; 1 - линейный масштабный коэффициент 
;; 0.001 — площадной масштабный коэффициент 
;; 2 — точность округления 
;; 5 — высота текста 
;; префикса нет 
;; м2 - суффикс 
........


А нет ли подобного PTLB1 только чтоб текст, содержащий значение площади вставлялся в существующий текст ?

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

А возможно ли запихнуть формулу в поле, таким образом, чтобы считалась сумма значений (числовых) текстовых объектов? Может быть, не в таблицу, а в отдельном поле?

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

Всё можно сделать! Надо только делать :!:
Эта тема получила плодотворное продолжение в соседнем форуме My Webpage

Re: LISP. Вставка в таблицу поля, соотвествующего площади примитива

Добрый день!
Идея и вопрос.
В AutoCAD есть функция ВИДЫ МОДЕЛЕЙ.
Можно ли как то связать например Lisp AreaTT и созданные ВИДЫ МОДЕЛЕЙ.

Задача - Чтобы после Lisp AreaTT переходило на следующий по возрастанию ВИД МОДЕЛИ.