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

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

Простановка координат

Ответ
Поиск в этой теме
Непрочитано 29.08.2009, 19:02 #1
Простановка координат
G-RAV
 
Геодезист
 
г.Новосибирск
Регистрация: 16.08.2009
Сообщений: 86

Я долускаю, что уже надоел, но ничего не могу с собой поделать! Написал программу "простановка координат" с использованием элементов диалога DCL... Срочно нужна критика или полезные советы .... (моя проблема в том, что консультироваться больше не где)
DCL:
Код:
[Выделить все]
 
KOORD: dialog {label="Простановка координат";
:text{label="Укажите необходимые параметры";}
//:spacer{height=0.3;}
:radio_row{label="Тип координат";key="b2";
  :radio_button{label="X , Y"; key="xy";value="0";}
  :radio_button{label="А , Б"; key="ab";value="1";}
  }//row
:edit_box{label="Высота текста:"; key="ht$"; edit_width=4;}
:ok_button{label="Указать >";is_cancel=true;}
}//texp
LISP:
Код:
[Выделить все]
 
(defun C:KOORD (/ xy$ ab$ PCen Pvin ht)
(setq
old_cmdecho   (getvar "cmdecho")
 )
(setvar "cmdecho" 0)
 
(setq ht "0.3")
 
(if (< (setq dcl_koord (load_dialog "KOORD.dcl")) 0)
    (exit)
  ) ;_ end of if
(if (not (new_dialog "KOORD" dcl_koord))
    (exit)
  ) ;_ end of if
(set_tile "ht$" ht) 
(action_tile "ht$" "(setq ht $value)")
(action_tile "xy" "(setq xy$ $value)")
(start_dialog)
(unload_dialog dcl_koord)
(command "_osnap" "_cen,_nod,_endp,_int")
(setq PCen(getpoint "\nТочка координирования: "))
 
(while (/= PCen nil)
(setvar 'dimzin 1)
(setq Pvin(getpoint PCen"\nВторая точка выноски: "))
(setq znakX "-")
(if (> (car PCen) 0) (setq znakX "+"))
(setq znakY "-")
(if (> (cadr PCen) 0) (setq znakY "+"))
 
(setq ostatokX (rtos(-(atof(rtos (abs (car PCen)) 2 3)) (*(abs(atof (itoa(/(atoi(rtos (car PCen) 2 3))100))))100))2 3)) 
(setq ostatokY (rtos(-(atof(rtos (abs (cadr PCen)) 2 3)) (*(abs(atof (itoa(/(atoi(rtos (cadr PCen) 2 3))100))))100))2 3)) 
(setq X (strcat (itoa(/(atoi(rtos (car PCen) 2 3))100)) "Б" znakX ostatokX ))
(setq Y (strcat (itoa(/(atoi(rtos (cadr PCen) 2 3))100)) "А" znakY ostatokY ))
   (if (= xy$ "1")
(setq
  X (rtos (car PCen) 2 3)
  Y (rtos (cadr PCen) 2 3)))
(cond ((> (car PCen) (car Pvin)) 
 (setq 3Point (polar Pvin 0 (-(* (atof ht) (max (strlen Y) (strlen X)))))))
 ((<= (car PCen) (car Pvin)) 
 (setq 3Point (polar Pvin 0 (* (atof ht) (max (strlen Y) (strlen X)))))))  
  (setq sts (ssadd))
 
 (progn
  (command "_layer" "_m" "G_KOORD" "")
(cond ((<= (car PCen) (car Pvin))
        (vl-cmdf "_pline" PCen Pvin 3Point "")
        (ssadd (entlast) sts)
        (vl-cmdf "_insert" "XY" Pvin (* 5 (atof ht)) (* 5 (atof ht)) 0 X Y)
        (ssadd (entlast) sts))
 
 ((> (car PCen) (car Pvin))
 (vl-cmdf "_pline" PCen Pvin 3Point "")
 (ssadd (entlast) sts)  
 (vl-cmdf "_insert" "XY" 3Point (* 5 (atof ht)) (* 5 (atof ht)) 0 X Y)
 (ssadd (entlast) sts)  
      )
      )
  )
 
(vl-cmdf "_group" "_c" "*" "" sts "")
(command "_osnap" "_cen,_nod,_endp,_int")   
(setq PCen(getpoint "\nТочка координирования: "))
    )
 
(setvar "cmdecho" old_cmdecho)
)

Вложения
Тип файла: dwg
DWG 2004
XY.dwg (49.3 Кб, 576 просмотров)


Последний раз редактировалось G-RAV, 31.08.2009 в 09:52.
Просмотров: 4301
 
Непрочитано 31.08.2009, 09:36
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


1.
В DCL:
edit_limit=true;
Что это означает?
2.
(setvar "clayer" old_clayer)
(setvar "osmode" old_osmode)
(setvar "cmdecho" old_cmdecho)
(setvar "PICKSTYLE" old_cmdecho)
(setvar "REGENMODE" old_REGENMODE)

Эти выражения вне функции C:KOORD. Мне то все равно, а вот AutoCAD ругается, что не знает таких переменных
3.
(3POINT DCL_KOORD HT OLD_CLAYER OLD_CMDECHO OLD_OSMODE OLD_PICKSTYLE OLD_REGENMODE OSTATOKX OSTATOKY STS X XY$ Y ZNAKX ZNAKY)
К чему это я?
4.
(setq sts (ssadd))
дважды зачем-то в коде
5.
Без шаманских действий не догадаешься, как нормально завершить работу программы...
6.
Блок "XY" не у всех есть...

Это так, проверка "орфографии", потому как что программа должна делать только смутно догадываюсь.
Do$ вне форума  
 
Автор темы   Непрочитано 31.08.2009, 10:13
#3
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Спасибо за отклик и критику... Все, что понял и увидел, поправил еще добавил рисунок XY.dwg, содержащий необходимый блок.. Попробую ответить по порядку на все замечания:
Цитата:
Сообщение от Do$ Посмотреть сообщение
1.
В DCL:
edit_limit=true;
Что это означает?
Я думал, что таким образом снимаю ограничение на количество символов, но оказывается, что этот параметр наоборот задает ограничение и в данном случае необязателен... (короче затупил )

Цитата:
2.
(setvar "clayer" old_clayer)
(setvar "osmode" old_osmode)
(setvar "cmdecho" old_cmdecho)
(setvar "PICKSTYLE" old_cmdecho)
(setvar "REGENMODE" old_REGENMODE)
Эти выражения вне функции C:KOORD. Мне то все равно, а вот AutoCAD ругается, что не знает таких переменных
Скажу откровенно, что с системными переменными только знакомлюсь, пытаюсь понять какие из них должны присутствовать в моем коде... Но здесь наверное перебрал , поэтому оставил только cmdecho....
Цитата:
3.
(3POINT DCL_KOORD HT OLD_CLAYER OLD_CMDECHO OLD_OSMODE OLD_PICKSTYLE OLD_REGENMODE OSTATOKX OSTATOKY STS X XY$ Y ZNAKX ZNAKY)
К чему это я?
Остается только догадываться... думаю, что это локальные переменные, которые я не указал....
Цитата:
4.
(setq sts (ssadd))
дважды зачем-то в коде
убрал...
Цитата:
6.
Блок "XY" не у всех есть...
добавил в первое сообщение...
G-RAV вне форума  
 
Непрочитано 31.08.2009, 10:48
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от G-RAV Посмотреть сообщение
Скажу откровенно, что с системными переменными только знакомлюсь, пытаюсь понять какие из них должны присутствовать в моем коде... Но здесь наверное перебрал , поэтому оставил только cmdecho....
Да бог с ними, впиши ты их туда хоть все что есть в Автокаде
Просто закрывающая функцию скобка стояла до них.
Do$ вне форума  
 
Автор темы   Непрочитано 02.09.2009, 19:44
#5
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Вот подправил код:
Учел все замечанния Do$, добавил системную переменную OSMODE, уже с помощью нее регулировал привязку, добавил обработчика ошибок (почти вслепую), спер его с http://forum.dwg.ru/showthread.php?t=22894&page=16 ....
ВООБЩЕМ, КРИТИКУЙТЕ РЕБЯТА ...
Код:
[Выделить все]
(defun C:KOORD (/  xy$   ab$    PCen     Pvin     3Point
  ht  dcl_koord    old_cmdecho      sts
  znakX  znakY   X    Y  *error* 
        )
  (defun *error* (msg)
    (princ msg)
    (if old_cmdecho
      (setvar "cmdecho" old_cmdecho)
    )
    (if old_osmode
      (setvar "osmode" old_osmode)
    )
  )
  (setq old_cmdecho (getvar "cmdecho"))
  (setq old_osmode (getvar "osmode"))
  (setvar "cmdecho" 0)
  (setvar "osmode" 45)
  (setq ht "0.3")
  (if (< (setq dcl_koord (load_dialog "KOORD.dcl")) 0)
    (exit)
  ) ;_ end of if
  (if (not (new_dialog "KOORD" dcl_koord))
    (exit)
  ) ;_ end of if
  (set_tile "ht$" ht)
  (action_tile "ht$" "(setq ht $value)")
  (action_tile "xy" "(setq xy$ $value)")
  (action_tile "ab" "(setq ab$ $value)")
  (start_dialog)
  (unload_dialog dcl_koord)
  (setq PCen (getpoint "\nТочка координирования: "))
  (while (/= PCen nil)
    (setvar 'dimzin 1)
    (setq Pvin (getpoint PCen "\nВторая точка выноски: "))
    (setq znakX "-")
    (if (> (car PCen) 0)
      (setq znakX "+")
    )
    (setq znakY "-")
    (if (> (cadr PCen) 0)
      (setq znakY "+")
    )
    (setq ostatokX
    (rtos
      (-
        (atof (rtos (abs (car PCen)) 2 3))
        (* (abs
      (atof (itoa (/ (atoi (rtos (car PCen) 2 3)) 100))
      )
    )
    100
        )
      )
      2
      3
    )
    )
    (setq ostatokY
    (rtos
      (-
        (atof (rtos (abs (cadr PCen)) 2 3))
        (*
   (abs
     (atof (itoa (/ (atoi (rtos (cadr PCen) 2 3)) 100))
     )
   )
   100
        )
      )
      2
      3
    )
    )
    (setq X (strcat (itoa (/ (atoi (rtos (car PCen) 2 3)) 100))
      "Б"
      znakX
      ostatokX
     )
    )
    (setq Y (strcat (itoa (/ (atoi (rtos (cadr PCen) 2 3)) 100))
      "А"
      znakY
      ostatokY
     )
    )
    (if (= xy$ "1")
      (setq
 X (rtos (car PCen) 2 3)
 Y (rtos (cadr PCen) 2 3)
      )
    )
    (cond ((> (car PCen) (car Pvin))
    (setq
      3Point (polar Pvin
      0
      (- (* (atof ht) (max (strlen Y) (strlen X))))
      )
    )
   )
   ((<= (car PCen) (car Pvin))
    (setq 3Point
    (polar Pvin 0 (* (atof ht) (max (strlen Y) (strlen X))))
    )
   )
    )
    (setq sts (ssadd))
    (progn
      (vl-cmdf "_layer" "_m" "G_KOORD" "")
      (cond ((<= (car PCen) (car Pvin))
      (vl-cmdf "_pline" PCen Pvin 3Point "")
      (ssadd (entlast) sts)
      (vl-cmdf "_insert"
        "XY"
        Pvin
        (* 5 (atof ht))
        (* 5 (atof ht))
        0
        X
        Y
      )
      (ssadd (entlast) sts)
     )
     ((> (car PCen) (car Pvin))
      (vl-cmdf "_pline" PCen Pvin 3Point "")
      (ssadd (entlast) sts)
      (vl-cmdf "_insert"
        "XY"
        3Point
        (* 5 (atof ht))
        (* 5 (atof ht))
        0
        X
        Y
      )
      (ssadd (entlast) sts)
     )
      )
    )
    (vl-cmdf "_group" "_c" "*" "" sts "")
    (setq PCen (getpoint "\nТочка координирования: "))
  )
  (setvar "osmode" old_osmode)
  (setvar "cmdecho" old_cmdecho)
)

Последний раз редактировалось G-RAV, 03.09.2009 в 06:43.
G-RAV вне форума  
 
Непрочитано 03.09.2009, 00:06
#6
Кулик Алексей aka kpblc
Moderator

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


Первое, что бросилось в глаза - *error* не переведен в локальный. То есть первая строка будет типа
Код:
[Выделить все]
(defun c:koord (/ xy$ ab$ pcen pvin 3point ht dcl_koord old_cmdecho sts znakx znaky x y *error*)
С остальным не разбирался.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.09.2009, 06:44
#7
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Первое, что бросилось в глаза - *error* не переведен в локальный. То есть первая строка будет типа
Код:
[Выделить все]
(defun c:koord (/ xy$ ab$ pcen pvin 3point ht dcl_koord old_cmdecho sts znakx znaky x y *error*)
С остальным не разбирался.
Подправил #5..
Еще обнаружил проблему с слоем. Если слой G_KOORD заморожен при использовании (vl-cmdf "_layer" "_m" "G_KOORD" "") рисует в текущем слое, если использую command процедура вообще обрывается. Попробывал, что то типа (or (vl-cmdf "_layer" "_m" "G_KOORD" "") (vl-cmdf "_layer" "_s" "G_KOORD" "") ) проблема не исчезла....
Может здесь необходимо как-нибудь использовать сис. переменную CLAYER?

Последний раз редактировалось G-RAV, 03.09.2009 в 07:18.
G-RAV вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Простановка координат



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
2 системы координат в одном файле SStas AutoCAD 8 20.06.2007 10:22
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47
простановка реальных ординатных размеров (координат точек) AnnaT AutoCAD 7 15.06.2005 17:56
управление системой координат Автокад из Делфей Владимир В Программирование 12 27.04.2005 09:54
VBA и система координат Ра Программирование 3 10.12.2003 17:40