Тема: Исполнительная схема свайного поля

Написал программку, рисует и подписывает отклонения сваи от проекта

(defun C:svai (/ osm cla col sv_pr sv_f    d_x d_y    z_f d_x_t d_y_t    z_p uglx
           ugly)
  (setq osm (getvar "OSMODE"))
  (setq cla (getvar "CLAYER"))
  (setq col (getvar "CECOLOR"))
  (setq z_p (getreal "\nВведите проектную отметку свай: "))
  (while
    (and
      (setvar "osmode" 41)
      (setvar "ERRNO" 0)
      (setq sv_pr (getpoint "\nПроектное положение сваи <Выход>"))
        (/= (getvar "ERRNO") 52)
         (setq sv_f (getpoint "\nФактическое положение сваи"))
        (/= (getvar "ERRNO") 52)
      (setq d_x
        (- (nth 0 sv_pr) (nth 0 sv_f))
         d_y
        (- (nth 1 sv_pr) (nth 1 sv_f))
         z_f
        (nth 2 sv_f)
         d_x_t
        (abs (fix (* d_x 1000)))
         d_y_t
        (abs (fix (* d_y 1000)))
      )
      (setvar "osmode" 0)
      (if z_p
    (setq z_t (fix (* 1000 (- z_f z_p))))
    (setq z_t "")
      )
      (VL-CMDF "_-style" "159" "Arial" "0.15" "" "" "" "")
      (VL-CMDF "_-LAYER" "_M" "Подп" "_C" 7 "" "_LW" 0.5 "" "")
      (VL-CMDF "_-color" "ByLayer" "")
      (VL-CMDF "_.text"
           (polar sv_pr 5.0630 0.36)
           "0"
           z_t
           ""
      )
      (if (> d_x 0)
    (progn
      (setq uglx pi)
      (VL-CMDF "_.text"
           "_J"
           "_R"
           (polar sv_pr 2.730 0.3)
           "0"
           d_x_t
           ""
      )
    )
    (progn
      (setq uglx 0)
      (VL-CMDF "_.text"
           (polar sv_pr 0.412 0.3)
           "0"
           d_x_t
           ""
      )
    )
      )
      (if (> d_y 0)
    (progn
      (setq ugly (+ pi (/ pi 2)))
      (VL-CMDF "_.text"
           "_J"
           "_R"
           (polar sv_pr 4.3004 0.3)
           "90"
           d_y_t
           ""
      )
    )
    (progn
      (setq ugly (/ pi 2))
      (VL-CMDF "_.text"
           (polar sv_pr 1.9828 0.3)
           "90"
           d_y_t
           ""
      )
    )
      )
                    ;End setq
  (VL-CMDF "_-LAYER" "_M" "Свая" "_C" 5 "" "_LW" 0.5 "" "")
  (VL-CMDF "_.rectang"
       (polar sv_pr (/ pi 4) 0.212132)
       (polar sv_pr (+ pi (/ pi 4)) 0.212132)
       ""
  )
  (VL-CMDF "_.-LAYER" "_M" "Стрелки" "_C" 1 "" "_LW" 0.5 "" "")
  (VL-CMDF "_.pline"
       (polar sv_pr ugly 0.15)
       (polar sv_pr ugly 0.55)
       ""
  )
  (VL-CMDF "_.pline"
       (polar sv_pr uglx 0.15)
       (polar sv_pr uglx 0.55)
       ""
  )
  (VL-CMDF "_.pline"
       (polar (polar sv_pr uglx 0.55)
          (+ uglx 2.7676)
          0.20
       )
       (polar sv_pr uglx 0.55)
       (polar (polar sv_pr uglx 0.55)
          (- uglx 2.7676)
          0.20
       )
       ""
  )
  (VL-CMDF "_.pline"
       (polar (polar sv_pr ugly 0.55)
          (+ ugly 2.7676)
          0.20
       )
       (polar sv_pr ugly 0.55)
       (polar (polar sv_pr ugly 0.55)
          (- ugly 2.7676)
          0.20
       )
       ""
  )))
  (setvar "OSMODE" osm)
  (setvar "CLAYER" cla)
  (setvar "CECOLOR" col)
)

Вроде работает, но есть два вопроса:
1. Как востоновить стиль текста, который был до программы
2. Подскажите пожалуйста мои грубые ошибки, или что можно было бы упростить

Re: Исполнительная схема свайного поля

Если текстовый стиль будет с 0 высотой?
Текстовый стиль, по-моему, хранится в сист.переменной textstyle.

Re: Исполнительная схема свайного поля

Спасибо за TEXTSTYLE
А вот вопрос

Если текстовый стиль будет с 0 высотой?

Я не понял, там же написано

(VL-CMDF "_-style" "159" "Arial" "0.15" "" "" "" "")

0.15 - высота

Re: Исполнительная схема свайного поля

И ещё вапрос:
переменная ERRNO — взял из другой программы, понял что ERRNO=52 — Enter, и ни где больше ни чего про неё найти не могу?

Re: Исполнительная схема свайного поля

> Геодезист
Хорошо, ненулевой высоты. 0.15 будет воспринят как угол поворота. Просто я тексты уже очень давно командными методами не создаю...

> Геодезист
В справке все описано:

ERRNO Системная переменная
(Только чтение)
Тип:  целый
Сохранен в:  Не сохранен
Начальное значение:  0
Отображает номер соответствующего кода ошибки, когда вызов функции AutoLISP приводит к ошибки, определенной AutoCAD . Приложения AutoLISP могут определить текущее значение переменной ERRNO через функцию (getvar"errno").
Системная переменная ERRNO не всегда сбрасывается в нуль. Кроме случаев, когда переменная проверяется сразу после сигнала об ошибке из функции AutoLISP, ошибка, о которой свидетельствует значение переменной, может быть неверной. Перед созданием или открытием рисунка данная переменная всегда очищается.
Более подробно см. AutoLISP Developer’s Guide .

AutoLISP Error Codes
   AutoLISP Error Codes
Error Codes
The following table shows the values of error codes generated by AutoLISP. The ERRNO system variable is set to one of these values when an AutoLISP function call causes an error that AutoCAD detects. AutoLISP applications can inspect the current value of ERRNO with (getvar "errno").
The ERRNO system variable is not always cleared to zero. Unless it is inspected immediately after an AutoLISP function has reported an error, the error that its value indicates may be misleading. This variable is always cleared when starting or opening a drawing.
Note The possible values ofERRNO, and their meanings, are subject to change.
Online program error codes
Value Meaning
0 No error
1 Invalid symbol table name
2 Invalid entity or selection set name
3 Exceeded maximum number of selection sets
4 Invalid selection set
5 Improper use of block definition
6 Improper use of xref
7 Object selection: pick failed
8 End of entity file
9 End of block definition file
10 Failed to find last entity
11 Illegal attempt to delete viewport object
12 Operation not allowed during PLINE
13 Invalid handle
14 Handles not enabled
15 Invalid arguments in coordinate transform request
16 Invalid space in coordinate transform request
17 Invalid use of deleted entity
18 Invalid table name
19 Invalid table function argument
20 Attempt to set a read-only variable
21 Zero value not allowed
22 Value out of range
23 Complex REGEN in progress
24 Attempt to change entity type
25 Bad layer name
26 Bad linetype name
27 Bad color name
28 Bad text style name
29 Bad shape name
30 Bad field for entity type
31 Attempt to modify deleted entity
32 Attempt to modify seqend subentity
33 Attempt to change handle
34 Attempt to modify viewport visibility
35 Entity on locked layer
36 Bad entity type
37 Bad polyline entity
38 Incomplete complex entity in block
39 Invalid block name field
40 Duplicate block flag fields
41 Duplicate block name fields
42 Bad normal vector
43 Missing block name
44 Missing block flags
45 Invalid anonymous block
46 Invalid block definition
47 Mandatory field missing
48 Unrecognized extended data (XDATA) type
49 Improper nesting of list in XDATA
50 Improper location of APPID field
51 Exceeded maximum XDATA size
52 Entity selection: null response
53 Duplicate APPID
54 Attempt to make or modify viewport entity
55 Attempt to make or modify an xref, xdef, or xdep
56 ssget filter: unexpected end of list
57 ssget filter: missing test operand
58 ssget filter: invalid opcode (–4) string
59 ssget filter: improper nesting or empty conditional clause
60 ssget filter: mismatched begin and end of conditional clause
61 ssget filter: wrong number of arguments in conditional clause (for NOT or XOR)
62 ssget filter: exceeded maximum nesting limit
63 ssget filter: invalid group code
64 ssget filter: invalid string test
65 ssget filter: invalid vector test
66 ssget filter: invalid real test
67 ssget filter: invalid integer test
68 Digitizer is not a tablet
69 Tablet is not calibrated
70 Invalid tablet arguments
71 ADS error: Unable to allocate new result buffer
72 ADS error: Null pointer detected
73 Cannot open executable file
74 Application is already loaded
75 Maximum number of applications already loaded
76 Unable to execute application
77 Incompatible version number
78 Unable to unload nested application
79 Application refused to unload
80 Application is not currently loaded
81 Not enough memory to load application
82 ADS error: Invalid transformation matrix
83 ADS error: Invalid symbol name
84 ADS error: Invalid symbol value
85 AutoLISP/ADS operation prohibited while a dialog box was displayed

Re: Исполнительная схема свайного поля

Упс, не обратил внимания, что стиль создается с фиксированной высотой... Сорри.

Re: Исполнительная схема свайного поля

В общем я бы добавил сохранение TEXTSTYLE, обработку *error*, убрал лишний ввод ("") в _rectang и _text

(defun C:svai (/ osm cla col sv_pr sv_f  d_x d_y  z_f d_x_t d_y_t  z_p uglx
         ugly *error* tst)
  (defun *error* (msg)(princ msg)
    (setvar "OSMODE" osm)
    (setvar "CLAYER" cla)
    (setvar "CECOLOR" col)
    (setvar "TEXTSTYLE" tst)(princ)
    )
  (setvar "CMDECHO" 0)
  (setq osm (getvar "OSMODE"))
  (setq cla (getvar "CLAYER"))
  (setq col (getvar "CECOLOR"))
  (setq tst (getvar "TEXTSTYLE"))
  (setq z_p (getreal "\nВведите проектную отметку свай: "))
(princ "\n**0 ")
  (VL-CMDF "_-style" "159" "Arial" "0.15" "" "" "" "")
  (while
    (and
      (setvar "osmode" 41)
      (setq sv_pr (getpoint "\nПроектное положение сваи <Выход>"))
      (setq sv_f (getpoint "\nФактическое положение сваи <Выход>"))
      (setq d_x
      (- (nth 0 sv_pr) (nth 0 sv_f))
       d_y
      (- (nth 1 sv_pr) (nth 1 sv_f))
       z_f
      (nth 2 sv_f)
       d_x_t
      (abs (fix (* d_x 1000)))
       d_y_t
      (abs (fix (* d_y 1000)))
      )
      (setvar "osmode" 0)
      (if z_p
  (setq z_t (fix (* 1000 (- z_f z_p))))
  (setq z_t "")
      )
      (VL-CMDF "_-LAYER" "_M" "Подп" "_C" 7 "" "_LW" 0.5 "" "")
      (VL-CMDF "_-color" "ByLayer"
               ;;; "" ;_Лишняя
               )
      (VL-CMDF "_.text"
         (polar sv_pr 5.0630 0.36)
         "0"
         z_t
         ;;; ""  ;_Лишняя
      )
      (if (> d_x 0)
  (progn
    (setq uglx pi)
    (VL-CMDF "_.text"
       "_J"
       "_R"
       (polar sv_pr 2.730 0.3)
       "0"
       d_x_t
         ;;; ""  ;_Лишняя
    )
  )
  (progn
    (setq uglx 0)
    (VL-CMDF "_.text"
       (polar sv_pr 0.412 0.3)
       "0"
       d_x_t
         ;;; ""  ;_Лишняя
    )
  )
      )
 (if (> d_y 0)
  (progn
    (setq ugly (+ pi (/ pi 2)))
    (VL-CMDF "_.text"
       "_J"
       "_R"
       (polar sv_pr 4.3004 0.3)
       "90"
       d_y_t
         ;;; ""  ;_Лишняя
    )
  )
  (progn
    (setq ugly (/ pi 2))
    (VL-CMDF "_.text"
       (polar sv_pr 1.9828 0.3)
       "90"
       d_y_t
         ;;; ""  ;_Лишняя
    )
  )
      )
  (VL-CMDF "_-LAYER" "_M" "Свая" "_C" 5 "" "_LW" 0.5 "" "")
  (VL-CMDF "_.rectang"
     (polar sv_pr (/ pi 4) 0.212132)
     (polar sv_pr (+ pi (/ pi 4)) 0.212132)
     ;;; ""   ;_ Лишняя кавычка
  )
  (VL-CMDF "_.-LAYER" "_M" "Стрелки" "_C" 1 "" "_LW" 0.5 "" "")
  (VL-CMDF "_.pline"
     (polar sv_pr ugly 0.15)
     (polar sv_pr ugly 0.55)
     ""
  )
  (VL-CMDF "_.pline"
     (polar sv_pr uglx 0.15)
     (polar sv_pr uglx 0.55)
     ""
  )
  (VL-CMDF "_.pline"
     (polar (polar sv_pr uglx 0.55)
      (+ uglx 2.7676)
      0.20
     )
     (polar sv_pr uglx 0.55)
     (polar (polar sv_pr uglx 0.55)
      (- uglx 2.7676)
      0.20
     )
     ""
  )
  (VL-CMDF "_.pline"
     (polar (polar sv_pr ugly 0.55)
      (+ ugly 2.7676)
      0.20
     )
     (polar sv_pr ugly 0.55)
     (polar (polar sv_pr ugly 0.55)
      (- ugly 2.7676)
      0.20
     )
     ""
  )
      )
    )
    (setvar "OSMODE" osm)
    (setvar "CLAYER" cla)
    (setvar "CECOLOR" col)
    (setvar "TEXTSTYLE" tst)
  (princ)
)

Re: Исполнительная схема свайного поля

Забыл добавить. ERRNO там не нужно. При неинициадизированном initget'е getpoint вернет nil. Errno нужно для анализа почему entsel вернул nil: пользователь нажал Enter или пользователь промахнулся прои выборе объекта

Re: Исполнительная схема свайного поля

Просто я тексты уже очень давно командными методами не создаю...

Да, я бы тоже хотел научиться работать с примитивами и использовать  ObjectARX, но большой необходимости в этом нет (хотел упростить себе работу - упростил, программа работает, что бы  ещё соченить - пока на ум не приходит), а на Lisp, как хобби время нет.

(setvar "TEXTSTYLE" tst)(princ)

я сделал тоже самое, причем обозвал её так же "tst", когда увидил твою - удивился.
Про ERRNO, спасибо объяснили.

(изменено: Артем Власов, 26 сентября 2011г. 14:09:34)

Re: Исполнительная схема свайного поля

(VL-CMDF "_-LAYER" "_M" "Свая" "_C" 5 "" "_LW" 0.5 "" "")
  (VL-CMDF "_.rectang"
      (polar sv_pr (/ pi 4) 0.212132)
      (polar sv_pr (+ pi (/ pi 4)) 0.212132)
      ""

Рисует квадрат 0.3 на 0.3, а хотелось бы круг, диаметром, к примеру, 0.2. Исправляю .rectang на .circle - сбивается позиция. Пробовал оставить её на место, играя с числами в строках (/ pi 4) 0.212132) и (+ pi (/ pi 4)) 0.212132) - круг то перемещается, то меняет размер. Правильно посадить не могу.

Смысл: рисование свай квадратами на исполнительных, по нашему мнению, это прошлый век. Раньше только забивные сваи были, они все имели такую форму оголовка. Сейчас же - буровые. На небольших объектах можно потратить время и вручную заменить рисуемый лиспом квадрат на круг, подогнав под него стрелки, но на объектах с количеством свай более 1000 это ... проблематично.

Выражаю благодарность за создание приложения от геодезистов ЗАО "Геотехника-С", г. Саратов. Отличная работа!

Re: Исполнительная схема свайного поля

Артем Власов пишет:

...заменить рисуемый лиспом квадрат на круг...

Лучше рисовать лиспом не квадрат, а динамический блок, у которого будет несколько состояний видимости - квадрат, круг и т.д.

Re: Исполнительная схема свайного поля

Лучше рисовать лиспом не квадрат, а динамический блок, у которого будет несколько состояний видимости - квадрат, круг и т.д.

Это обращение к создателю приложения?

Я то, не имея навыков в создании и модификации лиспов, только прыгаю от того, что есть ".rectang".

Re: Исполнительная схема свайного поля

pan, а ты сможешь лиспом сгенерировать полноценный динамический блок? Было бы очень интересно посмотреть на код.
Я бы просто вставлял блок, устанавливая ему различные параметры...

(изменено: Владимир Азарко, 10 октября 2011г. 19:25:26)

Re: Исполнительная схема свайного поля

Артем Власов пишет:

Правильно посадить не могу.

Без проверки

(VL-CMDF "_-LAYER" "_M" "Свая" "_C" 5 "" "_LW" 0.5 "" "") 
;(VL-CMDF "_.rectang" 
;(polar sv_pr (/ pi 4) 0.212132) 
;(polar sv_pr (+ pi (/ pi 4)) 0.212132) 
;"")
  (VL-CMDF "_.CIRCLE" "_none" sv_pr 0.1) ;_0.1- радиус круга

(изменено: Артем Власов, 14 октября 2011г. 10:23:06)

Re: Исполнительная схема свайного поля

Владимир Азарко пишет:

Без проверки

(VL-CMDF "_-LAYER" "_M" "Свая" "_C" 5 "" "_LW" 0.5 "" "") 
;(VL-CMDF "_.rectang" 
;(polar sv_pr (/ pi 4) 0.212132) 
;(polar sv_pr (+ pi (/ pi 4)) 0.212132) 
;"")
  (VL-CMDF "_.CIRCLE" "_none" sv_pr 0.1) ;_0.1- радиус круга

Спасибо! Близко к цели!
Круг рисует, но с началом стрелок совпадает только при радиусе 1.15
Т.е. круг, радиусом 5, вообще поглощает и стрелки, и размеры...

впринципе, этого достаточно. Ведь лисп в первоначальном стостоянии не умел "правильно" менять свой масштаб...

Re: Исполнительная схема свайного поля

Кулик Алексей aka kpblc пишет:

pan,  а ты сможешь лиспом сгенерировать полноценный динамический блок? Было бы очень интересно посмотреть на код.
Я бы просто вставлял блок, устанавливая ему различные параметры...

Последнее я и имел ввиду. Если есть простое решение, зачем усложнять себе жизнь?
Хотя... Если создать динамический блок вручную, разве потом нельзя будет сделать слепок его DXF кодов? Понятно, что имя вставленного блока будет со звездочкой, и придется залезть в таблицу блоков, но разве это невозможно? Так, чисто теоретически?

Re: Исполнительная схема свайного поля

Первое решение найдено Евгением Елпановым: http://autolisp.ru/2011/11/28/create-dynblock/

Re: Исполнительная схема свайного поля

Кулик Алексей aka kpblc пишет:

Первое решение найдено Евгением Елпановым: http://autolisp.ru/2011/11/28/create-dynblock/

Для интереса
http://forums.autodesk.com/t5/NET/Progr … 9914#M2396

Re: Исполнительная схема свайного поля

Не люблю динамические блоки... Хоть лопни.
Ну вставлять сваи рисуночками тоже моветон... ИМХО
У себя в программе процессе диалога в зависимости от размера, формы и вида условного изображения создаю блок сваи с порядковым номером. Затем выбираю вид куста, поля или ленты свай из диалогового окна.
Вставляю в указанное место.
Можно глянуть "Рис.3. Пример выполненного плана свай и ростверков" http://www.arcada.com.ua/infot/po/arch/parks.html В самую низу страницы

Re: Исполнительная схема свайного поля

fixo, так Евгений предоставил решение для lisp, а не для .NET :)

Re: Исполнительная схема свайного поля

Кулик Алексей aka kpblc пишет:

fixo,  так Евгений предоставил решение для lisp, а не для .NET

Извини, сомневаюсь... :oops: