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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > mtext с опцией _mc и Fatal error

mtext с опцией _mc и Fatal error

Ответ
Поиск в этой теме
Непрочитано 30.07.2007, 16:03 #1
mtext с опцией _mc и Fatal error
Ax3
 
Programming, automation, CADs, GISs. "Теплоком"
 
Россия, Санкт-Петербург
Регистрация: 02.02.2007
Сообщений: 306

Всем привет.
(AutoCAD 2004)
Пишу незавершенную команду:
Код:
[Выделить все]
(defun	c:mtmc ()
	(vl-cmdf "_mtext" (getpoint) "_j" "_mc")
)
Работает нормально, (не считая того, что один раз ругается на неправильно заданную вторую точку и тут же ее повторно запрашивает уже у пользователя). Пользуюсь этим лиспиком (и сопутствующей "дыркой" в акаде) для автоматического назначения режима выравнивания текста. При этом внешний вид команды сохраняется.
А вот другой вариант:
Код:
[Выделить все]
(defun	func ()
	(vl-cmdf "_mtext" (getpoint) "_j" "_mc")
)
(vlax-add-cmd "mtmc" 'func)
вываливается с ошибкой
[/img]
[ATTACH]1185796786.JPG[/ATTACH]
В чем разница?
Просмотров: 3744
 
Непрочитано 30.07.2007, 16:19
#2
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Не используй при отладке команду VL-CMDF,
отлаживай сначала с помощью COMMAND,
потом не забывай добавлять PAUSE в тело
команды если она незавершенная

ЯТД

~'J'~
fixo вне форума  
 
Непрочитано 30.07.2007, 18:51
#3
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,176


Из справки для разработчиков
Цитата:
Warning You cannot use the command function call in a transparently defined vlax-add-cmd function. Doing so can cause AutoCAD to close unexpectedly.
Вольный перевод: если в командах, определяемых с помощью vlax-add-cmd, использовать вызов стандартных команд акада, то как глюканет, и нет сарая
kp+ вне форума  
 
Автор темы   Непрочитано 31.07.2007, 07:54
#4
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Хм, интересно. Однако вот такие варианты работают нормально:
Код:
[Выделить все]
(defun	func ()
	(command "_mtext" (getpoint) "_j" "_mc" (getpoint) "123" "")
)
(vlax-add-cmd "test" 'func)
Код:
[Выделить все]
(defun	func ()
	(vl-cmdf "_mtext" (getpoint) "_j" "_mc" (getpoint) "123" "")
)
(vlax-add-cmd "test" 'func)
Дело, имхо, именно в незавершенности команды. Странно как-то.
Ax3 вне форума  
 
Непрочитано 31.07.2007, 08:20
#5
Кулик Алексей aka kpblc
Moderator

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


Вот такой вариант вроде сработал нормально (проверял на ADT2k5Eng + SP1):
Код:
[Выделить все]
(defun func (/ st end err)
  (if
    (and
      (not (vl-catch-all-error-p
             (vl-catch-all-apply
               '(lambda () (setq st (getpoint "\nНачальная точка <Отмена> : ")))
               ) ;_ end of vl-catch-all-apply
             ) ;_ end of vl-catch-all-error-p
           ) ;_ end of not
      st
      (not (vl-catch-all-error-p
             (vl-catch-all-apply
               '(lambda ()
                  (setq end (getcorner st "\nКонечная точка <Отмена> : "))
                  ) ;_ end of lambda
               ) ;_ end of vl-catch-all-apply
             ) ;_ end of vl-catch-all-error-p
           ) ;_ end of not
      end
      ) ;_ end of and
     (if (vl-catch-all-error-p
           (setq err (vl-catch-all-apply
                       '(lambda ()
                          (vl-cmdf "_.mtext" st "_j" "_mc" end)
                          (while (/= 1 (boole (getvar "cmdactive") 1))
                            (command pause)
                            ) ;_ end of while
                          ) ;_ end of lambda
                       ) ;_ end of vl-catch-all-apply
                 ) ;_ end of setq
           ) ;_ end of vl-catch-all-error-p
       (progn
         (while (/= (logand (getvar "cmdactive") 31) 0)
           (command "")
           ) ;_ end of while
         (princ (strcat "\nОшибка выполнения : " (vl-catch-all-error-message err))
                ) ;_ end of princ
         ) ;_ end of progn
       ) ;_ end of if
     ) ;_ end of if
  ) ;_ end of defun

(vlax-add-cmd "test" 'func)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.07.2007, 08:25
#6
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Да, на акад2004 тоже работает. И даже рамочка есть
В чем фишка? В отлове ошибок?
Ax3 вне форума  
 
Непрочитано 31.07.2007, 08:31
#7
Кулик Алексей aka kpblc
Moderator

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


Скорее всего, да А также в завершенности команды в любом варианте - была ошибка при ее запуске, не было - все едино завершение выполняется корректно
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.07.2007, 08:38
#8
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Мучос грасиас, амиго. Включу эту прогу нашим конструкторам в набор утилит, с твоего позволения.
Только добавлю строчку
(prompt "Mtext_mc(c)Кулик Алексей aka kpblc@forum.dwg.ru_2007.07.31")
Ax3 вне форума  
 
Автор темы   Непрочитано 16.06.2009, 22:46
#9
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 306


Недавно перечитал - и придумал вариант в VBA с полным сохранением визуального интерфейса команды mtext и при этом - сохранением последней заданной пользователем опции выравнивания.

Код:
[Выделить все]
Public dp_mt__last_used_justifying_ As String

Public Sub dp_mtext()
'2009.06.16 В такой реализации полностью сохраняется интерфейс команды.
'В случае LISP теряется рамка ввода текста, запрос и ввод текста происходят в командной строке.
Dim dp_mt__st_pt_ As Variant
Dim dp_mt__st_ptx_ As String
Dim dp_mt__st_pty_ As String
Dim dp_mt__st_ptz_ As String
Dim dp_mt__kwlist_ As String
Dim dp_mt__last_used_justifying_tmp_ As String
Dim dp_mt__cmdecho_kp_ As Variant
Dim dp_mt__inputhstrmode_kp_ As Variant
On Error GoTo 0
    dp_mt__cmdecho_kp_ = ThisDrawing.GetVariable("cmdecho")
    dp_mt__inputhstrmode_kp_ = ThisDrawing.GetVariable("inputhistorymode")
    ThisDrawing.SetVariable "cmdecho", 0
On Error GoTo dp_mt__err_hndlr_
    dp_mt__kwlist_ = "tl tc tr ml mc mr bl bc br"
    ThisDrawing.Utility.InitializeUserInput 128, dp_mt__kwlist_
    If dp_mt__last_used_justifying_ = "" Then dp_mt__last_used_justifying_ = "tl"
    dp_mt__last_used_justifying_tmp_ = _
        ThisDrawing.Utility.GetKeyword _
            ("Enter justification [TL/TC/TR/ML/MC/MR/BL/BC/BR] " _
            & "<" _
            & UCase(dp_mt__last_used_justifying_) _
            & ">:" _
            )
'MsgBox "`" & dp_mt__last_used_justifying_tmp_ & "`"
    If _
        (dp_mt__last_used_justifying_tmp_ = " ") _
        Or _
        (dp_mt__last_used_justifying_tmp_ = "") _
        Or _
        IsNull(dp_mt__last_used_justifying_tmp_) _
    Then
    Else
        dp_mt__last_used_justifying_ = dp_mt__last_used_justifying_tmp_
    End If
    dp_mt__st_pt_ = ThisDrawing.Utility.GetPoint(, "Specify 1st corner: ")
    dp_mt__st_ptx_ = comma2dot(CStr(dp_mt__st_pt_(0)))
    dp_mt__st_pty_ = comma2dot(CStr(dp_mt__st_pt_(1)))
    dp_mt__st_ptz_ = comma2dot(CStr(dp_mt__st_pt_(2)))
    'dp_mt__last_used_justifying_ = ThisDrawing.Utility.GetString
    ThisDrawing.SendCommand ("_.mtext " & dp_mt__st_ptx_ & "," & dp_mt__st_pty_ & "," & dp_mt__st_ptz_ & " " & "_justify " & dp_mt__last_used_justifying_ & " ")
GoTo dp_mt__end_
dp_mt__err_hndlr_:
    ThisDrawing.SendCommand ("(prompt " & Chr(34) & "dpmt cancelled " & Chr(34) & ")" & vbCr)
dp_mt__end_:
On Error GoTo 0
    ThisDrawing.SetVariable "cmdecho", dp_mt__cmdecho_kp_
End Sub
Private Function comma2dot(ByRef cd__str_ As String)
Dim cd__tempstr_ As String
Dim cd__i_ As Integer
Dim cd__sym_ As String
    cd__tempstr_ = ""
    cd__i_ = 1
    While cd__i_ <= Len(cd__str_)
        cd__sym_ = Mid(cd__str_, cd__i_, 1)
        If cd__sym_ = "," Then cd__sym_ = "."
        cd__tempstr_ = cd__tempstr_ + cd__sym_
        cd__i_ = cd__i_ + 1
    Wend
    comma2dot = cd__tempstr_
End Function
К сожалению, в LISP такого не удалось добиться.
__________________
На LISPе можно мыслить!
Ax3 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > mtext с опцией _mc и Fatal error