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

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

LISP. Проблема создания размерного стиля в русской версии AutoCAD

Ответ
Поиск в этой теме
Непрочитано 15.12.2019, 12:36 #1
LISP. Проблема создания размерного стиля в русской версии AutoCAD
Browning Zed
 
Регистрация: 17.01.2014
Сообщений: 97

Всем привет! Пытаюсь программно создать размерный стиль, используя код Алексея Кулика:
https://autolisp.ru/2009/11/02/dimstyle-create/
Код нормально отрабатывается, до тех пор пока не доходит до групповых кодов 342, 343 и 344, отвечающих за вид блока стрелок на концах размерной линии. Проблема, по всей видимости, заключается в некорректном переводе, в русской версии AutoCAD, значений присваиваемых переменной DIMBLK.
Предположим, что нужно задать в размерном стиле вид стрелок "двойная засечка".
Если использовать код, приведенный выше как есть, группа 342 выглядит следующим образом:
Код:
[Выделить все]
 (cons 342 (_lispru-get-or-create-dimblock "_ArchTick"))
в итоге получаем "ошибка: неверная DXF-группа: (342)"

Если попробовать указать русифицированное значение DIMBLK:
Код:
[Выделить все]
 (cons 342 (_lispru-get-or-create-dimblock "ДвЗасечка"))
то размерный стиль создается, но нужный вид стрелок не назначается.

Если попробовать обмануть программу, сначала присвоив нужное значение переменной DIMBLK, а потом подхватить ее:
Код:
[Выделить все]
 (setvar "DIMBLK" "_ArchTIck")
(cons 342 (getvar "DIMBLK"))
Результатом будет: "ошибка: неверная DXF-группа: (342 . "ДвЗасечка")"

Какой выход можно найти из данной ситуации?
Просмотров: 2070
 
Непрочитано 15.12.2019, 13:00
#2
Кулик Алексей aka kpblc
Moderator

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


Фигню написал, снес

----- добавлено через ~5 мин. -----
В этих группах же указывается ename-указатель на описание блока, правильно? Что там может делать текст?
Проверь, какие блоки появляются при изменении системных переменных DIMBLK, DIMBLK1, DIMBLK2 - и попробуй использовать именно их.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.12.2019, 13:25
#3
Browning Zed


 
Регистрация: 17.01.2014
Сообщений: 97


Кулик Алексей aka kpblc, имя блока, который появляется при использовании размера с двойной засечкой - _ArchTick. Но, как я и писал выше, строка кода:
Код:
[Выделить все]
 (cons 342 (_lispru-get-or-create-dimblock "_ArchTick"))
выдает ошибку: неверная DXF-группа: (342). В том-то вся и проблема!
Browning Zed вне форума  
 
Непрочитано 15.12.2019, 13:30
#4
Кулик Алексей aka kpblc
Moderator

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


Вечером посмотрю. Возможно, проблема именно в _lispru-get-or-create-dimbloc - она возвращает nil почему-то.

----- добавлено через ~7 ч. -----
Ну да, коды 10-летней давности иногда хочется "развидеть"
Код:
[Выделить все]
 (vl-load-com)

(defun _lispru-get-or-create-dimblock (name / err dimblk)
                                      ;|
*    Получение ename-указателя или создание блока с переданным именем
* Если name попадает под стандартные наименования:
"" || "_DOT"        || "_DOTSMALL" || "_DOTBLANK"    || "_ORIGIN"      ||
   || "_ORIGIN2"    || "_OPEN"     || "_OPEN90"      || "_OPEN30"      ||
   || "_CLOSED"     || "_SMALL"    || "_NONE"        || "_OBLIQUE"     ||
   || "_BOXFILLED"  || "_BOXBLANK" || "_CLOSEDBLANK" || "_DATUMFILLED" ||
   || "_DATUMBLANK" || "_INTEGRAL" || "_ARCHTICK"

*  То используется механизм через (setvar / getvar). В противном случае получается
* указатель на имеющийся блок с таким именем. Если такого блока нет, он создается
* пустым.
*    Примеры вызова:
(_lispru-get-or-create-dimblock "qwert")
(_lispru-get-or-create-dimblock "archtick")
|;
  (cond ((wcmatch (strcase (vl-string-left-trim "_" name))
                  (strcat "\"\",DOT,DOTSMALL,DOTBLANK,ORIGIN,ORIGIN2,"
                          "OPEN,OPEN90,OPEN30,CLOSED,SMALL,"
                          "NONE,OBLIQUE,BOXFILLED,BOXBLANK,CLOSEDBLANK,"
                          "DATUMFILLED,DATUMBLANK,INTEGRAL,ARCHTICK"
                          ) ;_ end of strcat
                  ) ;_ end of wcmatch
         (if (vl-catch-all-error-p
               (setq err (vl-catch-all-apply
                           (function (lambda ()
                                       (setq dimblk (getvar "dimblk"))
                                       (if (= dimblk "")
                                         (setq dimblk ".")
                                         ) ;_ end of if
                                       (setvar "dimblk" (strcat "_" (vl-string-left-trim "_" name)))
                                       (setvar "dimblk" dimblk)
                                       (setq res (tblobjname "block" (strcat "_" (vl-string-left-trim "_" name))))
                                       ) ;_ end of lambda
                                     ) ;_ end of function
                           ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of vl-catch-all-error-p
           (setq res (tblobjname "block" (getvar "dimblk")))
           res
           ) ;_ end of if
         )
        ((tblobjname "block" name))
        (t
         (vla-add (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                  (vlax-3d-point '(0. 0. 0.))
                  name
                  ) ;_ end of vla-add
         (tblobjname "block" name)
         )
        ) ;_ end of cond
  ) ;_ end of defun
Функция может вернуть nil, если планируется использовать залитую стрелку: у этого блока мне пока не удалось получить указатель. Поэтому при entmake / entmakex придется пройтись по списку и "выкинуть" точечные пары, у которых второй элемент nil. vl-remove-if-not, к примеру, и вперед.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.12.2019, 22:57
#5
Browning Zed


 
Регистрация: 17.01.2014
Сообщений: 97


Вставил в код обновленную функцию, получаю следующее: размерный стиль теперь создается без проблем, но! - нужные стрелки так и не назначаются. Какое бы значение переменной DIMBLK в группах 342-344 не устанавливалось (_ARCHTICK, _OBLIQUE, и т.д.) - всегда создается залитая стрелка, и никак иначе. Вопрос так и остается без решения.
Browning Zed вне форума  
 
Непрочитано 16.12.2019, 10:23
1 | #6
Кулик Алексей aka kpblc
Moderator

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


А если так?
Код:
[Выделить все]
 (vl-load-com)

(defun _lispru-get-or-create-dimblock (name / err dimblk)
                                      ;|
*    Получение ename-указателя или создание блока с переданным именем
* Если name попадает под стандартные наименования:
"" || "_DOT"        || "_DOTSMALL" || "_DOTBLANK"    || "_ORIGIN"      ||
   || "_ORIGIN2"    || "_OPEN"     || "_OPEN90"      || "_OPEN30"      ||
   || "_CLOSED"     || "_SMALL"    || "_NONE"        || "_OBLIQUE"     ||
   || "_BOXFILLED"  || "_BOXBLANK" || "_CLOSEDBLANK" || "_DATUMFILLED" ||
   || "_DATUMBLANK" || "_INTEGRAL" || "_ARCHTICK"

*  То используется механизм через (setvar / getvar). В противном случае получается
* указатель на имеющийся блок с таким именем. Если такого блока нет, он создается
* пустым.
*    Примеры вызова:
(_lispru-get-or-create-dimblock "qwert")
(_lispru-get-or-create-dimblock "archtick")
|;
  (cond ((wcmatch (strcase (vl-string-left-trim "_" name))
                  (strcat "\"\",DOT,DOTSMALL,DOTBLANK,ORIGIN,ORIGIN2,"
                          "OPEN,OPEN90,OPEN30,CLOSED,SMALL,"
                          "NONE,OBLIQUE,BOXFILLED,BOXBLANK,CLOSEDBLANK,"
                          "DATUMFILLED,DATUMBLANK,INTEGRAL,ARCHTICK"
                          ) ;_ end of strcat
                  ) ;_ end of wcmatch
         (if (vl-catch-all-error-p
               (setq err (vl-catch-all-apply
                           (function (lambda ()
                                       (setq dimblk (getvar "dimblk"))
                                       (if (= dimblk "")
                                         (setq dimblk ".")
                                         ) ;_ end of if
                                       (setvar "dimblk" (strcat "_" (vl-string-left-trim "_" name)))
                                       (setvar "dimblk" dimblk)
                                       (setq res (tblobjname "block" (strcat "_" (vl-string-left-trim "_" name))))
                                       ) ;_ end of lambda
                                     ) ;_ end of function
                           ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of vl-catch-all-error-p
           (setq res (tblobjname "block" (getvar "dimblk")))
           ) ;_ end of if
         (if res
           (cdr (assoc 330 (entget res)))
           ) ;_ end of if
         )
        ((tblobjname "block" name) (cdr(assoc 330 (entget (tblobjname "block" "_archtick")))))
        (t
         (vla-add (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                  (vlax-3d-point '(0. 0. 0.))
                  name
                  ) ;_ end of vla-add
         (cdr (assoc 330 (entget (tblobjname "block" name))))
         )
        ) ;_ end of cond
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 16.12.2019 в 11:16.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.12.2019, 11:13
#7
Browning Zed


 
Регистрация: 17.01.2014
Сообщений: 97


Теперь все отлично, работает как нужно. Спасибо, Алексей!
Browning Zed вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Проблема создания размерного стиля в русской версии AutoCAD

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема открытия файлов в Autocad 2010 после установки Autocad 2015 Volodya AutoCAD 18 30.10.2014 14:30
Проблема с экспортированным из AutoCAD Architecture файлом *.dwg VAGpex AutoCAD 2 16.10.2014 15:31
Нерешаемая проблема с настройкой размерного стиля VAV AutoCAD 35 09.02.2012 16:40
В русской версии AutoCAD 2010 SP1 32-bit файл Acad.PGP содержит ошибки. hwd Баги и пожелания в Autodesk 21 21.04.2010 20:27
Проблема с XREF в Autocad 2005(2004). Помогите, кто знает. 0leg AutoCAD 10 13.01.2006 17:53