Biscuits,
Hope I’m not interrupting. I don’t really have time to offer much assistance but
I will offer this. LISP is an interpretive language. This means that you can
write and test expressions individually. If you are new to either LISP or to
using a particular function, then don’t try to swallow everything in one bite by
trying to write an entire function that uses the results from one function within
another function.
Instead test each line and each part of the line to understand what each
part returns. For instance,
Use setq for something, that is to save intermediate results so that you
can test them and re-use them.
(vl-load-com)
(setq es (entsel))
(setq ent (car es))
(setq object (vlax-ename->vla-object ent))
(setq result (vla-getboundingbox object ‘LL ‘UR))
(setq LLC (vlax-safearray->list LL))
….
But don’t do any of this inside a function until you do it
at either the VLISP console or the command line. There
you can see any errors that happen when they happen and
you can change the code to work.
Don’t try to be an expert with mapcar before you do the stuff
without mapcar. Don’t nest functions until you firmly understand
what each function returns and why.
After you really know what’s going on, then you could make
it look more compact but it probably won’t run any better and
may be more difficult to test, maintain, and comment.
Regards,
Doug
«Biscuits»
wrote in message news:f124ccf.14@WebX.maYIadrTaRb…
> I’ve gotten this routine to give me the lower left and upper right points of the
bounding box. How do get the routine to create a named view using these points, name the
view (1), then let me repeat the process until all title blocks have been selected and
named accordingly?
> (defun ax:GetBoundingBox (ent / LL UR)
> (vl-load-com)
> (vla-getboundingbox (vlax-ename->vla-object ent) ‘LL ‘UR)
> (mapcar ‘vlax-safearray->list (list ll ur)))
> (ax:GetBoundingBox (car (entsel)))
>
>
Когда Вы начнёте писать свои программы, то неизбежно столкнетесь с необходимостью решения проблем, которые в программировании носят название отладка программы.
Давайте рассмотрим некоторые технические приемы, которые помогут нам при создании новых программ на языке AutoLISP. К таким приемам относятся:
- Проверка фрагментов кода в окне «КонсольVisual LISP».
- Отслеживание парных кавычек.
- Поиск парных скобок в процессе и после написания кода.
- Использование окна «Контрольное значение»
Проверка фрагментов кода в окне «КонсольVisual LISP».
Вы можете проверить, насколько правильно вы понимаете синтаксис функции.
Давайте для примера рассмотрим функцию getpoint. Функция getpoint помогает нам задать координаты точки при помощи мыши. Давайте поищем эту функцию в справочной системе. Система выдаст следующую информацию. См. Рис. 1.
Рис. 1. «Окно справка»
Мы видим, что функция getpoint имеет два аргумента.
Первый, из которых pt – это координаты точки.
А второй msg — текст, который будет показан пользователю.
При чем оба аргумента не являются обязательными. Это следует из того, что они заключены в квадратные скобки ( [pt] [msg] )
Давайте откроем окно «КонсольVisual LISP» щелкнув по одноименной кнопке. См. Рис. 2.
Рис. 2. Добавляем (getpoint)
Введем функцию (getpoint) без аргументов и нажмем <Enter>.
Активным станем AutoCAD, где надо указать любую точку.
После указания точки, AutoCAD снова вернет нас в редактор Visual LISP.
В консоли появятся координаты указанной точки. См. Рис. 3.
Рис. 3. Координаты указанной точки.
Теперь давайте попробуем использовать аргументы. Введем функцию с первым аргументом (getpoint pt) и нажмем <Enter>. См. Рис. 4.
Рис. 4. Ошибка: не верный тип аргумента
Консоль выдаст нам сообщение об ошибке: неверный тип аргумента: point: nil.
Очевидно, переменная pt не содержит в себе значения. (значение nil означает, что аргумент не имеет значения). Давайте это проверим. Наберем в следующей строке pt и нажмем <Enter>. См. Рис. 5.
Рис. 5. Проверка значения переменной pt.
Консоль подтвердит наши предположения.
Давайте подставим, вместо pt координаты точки начало координат (getpoint (0 0 0)) и нажмем <Enter>. См. Рис. 6.
Рис. 6. Ошибка: неверная функция.
Консоль выдает сообщения об ошибке: неверная функция : 0. Скорее всего, координаты в скобках Visual LISP принял за функцию с именем 0 (вспоминаем, что после открывающийся скобки всегда следует имя функции). Как объяснить Visual LISP, что это не функция, а список координат? Для этого есть, два способа:
1) После открывающийся скобки добавить функцию list : (list 0 0 0)
2) Или перед открывающийся скобкой поставить апостроф: ‘(0 0 0)
Давайте снова напишем функцию, но уже с апострофом (getpoint ‘(0 0 0)) и нажимаем <Enter>. См. Рис. 7.
Рис. 7. Добавляем (getpoint ‘(0 0 0)).
Функция сделает активным AutoCAD и мы увидим, что указатель мыши как будто привязан ниточкой к началу координат. См. Рис. 8.
Рис. 8. Точка задается относительно другой точки.
И теперь мы можем задать точку, относительно другой точки, координаты которой являются первым аргументом функции getpoint. Щелкните в любом месте, и консоль вернет координаты выбранной точки. См. Рис. 9.
Рис. 9. Координаты указанной точки.
Давайте теперь разберемся со вторым аргументом. Напомню, что это msg — текст, который будет показан пользователю. Поскольку это текст (string), то писать его нужно в кавычках. Давайте добавим к нашей функции надпись: “Проверка”. См. Рис. 10.
Рис.. 10. Добавляем (getpoint ‘(0 0 0) «Проверка»)
Нажимаем <Enter>. И видим, что наша надпись появилась в командной строке. См. Рис. 11.
Рис. 11. Надпись в командной строке.
Очевидно, что второй аргумент функции getpoint, выдает подсказку пользователю, что в данный момент ему нужно сделать.
Давайте посмотрим пример применения этой функции в программе my_otr, которую я приводил в уроке: Построение отрезков в AutoCAD.
Открываем эту программу, выделяем вторую и третью строки и нажимаем на кнопку «Загрузить выделенный фрагмент». См. Рис. 12.
Рис. 12. Загрузка выделенного фрагмента.
Далее на просьбу в командной строке, выбираем первую точку (координаты этой точки при помощи функции присвоения setq запоминают в переменной р1). Появится следующая просьба. Вторую точку мы уже выбираем, ориентируясь на первую.
После указания второй точки в окне консоли появятся координаты выбранных точек. См. Рис. 13.
Рис. 13. Координаты выбранных точек.
Таким образом, мы проверили, как у нас работает выделенный фрагмент программы.
Я думаю, что после такова исследования, мы уже имеем четкое представление о том, как работает эта функция.
Отслеживание парных кавычек.
Раньше при написании кода в других текстовых редакторах одной из наиболее частых ошибок было не соблюдение правильного количества скобок и кавычек. Напомню, что количество открывающихся скобок и кавычек должно равняться количеству закрывающихся. В других текстовых редакторах отследить это было не всегда легко.
В 2000 году с появлением Visual LISP этот процесс стал значительно более простым.
Давайте начнем с простого и рассмотрим двойные кавычки. В Visual LISP применяется кодирование цветом, поэтому любая строка, заключенная в кавычки, на экране пурпурная. Кодирование цветом применяется в процессе ввода, поэтому после того, как вы поставили открывающиеся кавычки, остальная часть файла становится пурпурной до тех пор, пока вы не введете закрывающиеся кавычки. См. Рис. 14.
Рис. 14. Не закрытые кавычки.
Ставим в нужном месте закрывающиеся кавычки, и пурпурным сделается только текст, заключенный в кавычки с двух сторон. См. Рис. 15.
Рис. 15. Кавычки с двух сторон.
Стоит отметить, что в программах AutoLISP нужно всегда использовать кавычки вида “ ” (кавычки « » — не воспринимаются)
Поиск парных скобок в процессе и после написания кода.
С парными скобками все немного сложнее. Но в редакторе Visual LISP есть инструменты, которые помогают нам избежать лишних или недостающих скобок.
Прыгающий курсор.
Как только, в процессе написания кода новой программы, вы ставите закрывающую скобку, ваш курсор перескакивает к соответствующей ей открывающей. Если курсор не перескакивает, значит, вы поставили слишком много закрывающихся скобок (нет открывающийся скобки, к которой курсор мог бы переместиться). Если программа короткая, следить за перемещением курсора не сложно. В длинных программах следить за курсором сложнее, потому что в некоторых случаях открывающая скобка может находиться в не видимой области текущего окна.
Двойной щелчок возле скобок.
В редакторе Visual LISP проблема отслеживания перемещений курсора решена при помощи подсветки (выделения). Поместите курсор непосредственно перед открывающейся скобкой или после закрывающейся и щелкните дважды левой кнопкой мыши. Все содержимое скобок станет подсвеченным. Теперь вы видите, где находится парная скобка. См. Рис. 16.
Рис. 16. Выделение содержимого скобок.
Если кавычки и скобки в вашей программе расставлены правильно, но программа все равно не работает, не отчаивайтесь, отнеситесь к поиску ошибок как к интересной задаче.
Для начала определите, как далеко продвинулась ваша программа, прежде чем прекратила работать. Это можно сделать, если проверить значения присвоенные переменным.
Типы переменных.
В программах AutoLISP используются два типа переменных:
1) Системные переменные, которые описаны в AutoCAD (Пример: osmode).
2) Программные переменные, которые описаны и именованы вами.
Программные переменные могут быть как локальными, т. е. сохранять свои значения только на время выполнения программы, так и глобальными, сохраняющими значения после завершения работы программы, в которой они определены.
Когда вы добавляете в свою программу новую переменную, то по умолчанию она глобальная. Для того, чтобы она стала локальной ее нужно добавить в список временных переменных функции defun. См. Рис. 17.
Рис. 17. Список временных переменных.
Окно «Контрольное значение»
Для проверки значения переменных удобнее всего использовать окно «Контрольное значение». Для того, чтобы добавить переменную в это окно, поместите курсор на имени переменной р1 и нажмите на кнопку «Добавить контрольное значение». См. Рис. 18.
Рис. 18. Добавление переменных в окно «Контрольное значение».
Появится окно «Добавление контрольных значений», в котором нажимаем кнопку «ОК».
Наша переменная появится в окне «Контрольное значение». См. Рис. 19.
Рис. 19. Окно «Контрольное значение».
Чтобы окно «Добавление контрольных значений» не появлялось, а переменные сразу попадали в окно «Контрольное значение», переменную нужно выделить.
Давайте добавим в это окно и другие переменные.
Когда окно «Контрольное значение» открыто, можно добавлять переменные через кнопку «Добавить контрольное значение» расположенную в этом окне. См. Рис. 20.
Рис. 20. Кнопка «Добавить контрольное значение».
Теперь для того, чтобы увидеть значения переменных, после того как программа прекратила работать, нам необходимо все переменные сделать глобальными. Для этого их нужно убрать из списка временных переменных функции defun.
Затем загрузить нашу программу, нажав на кнопку «Загрузить активное окно редактора». См. Рис. 21.
Рис. 21. Загрузка программы.
Далее переходим в AutoCAD, нажав на кнопку «Активизация AutoCAD».
Набираем в командной строке mp_kub. См. Рис. 22.
Рис. 22. Вводим в командной строке mp_kub
Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.
Наша программа, которая должна была нарисовать куб. Этого не сделала.
Давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 23.
Рис. 23. Окно «Контрольное значение»
Мы видим, что переменные р1 и р2 имеют значения, а все остальные переменные нет. Очевидно, что ошибка произошла при расчете переменной р3. Находим эту строчку в программе и видим, что координаты точки р3 рассчитываются относительно самой себя. А должны были рассчитываться относительно точки р2.
Давайте, исправим ошибку, и снова загрузим нашу программу.
Перейдем в AutoCAD, набираем в командной строке mp_kub и нажмем <Enter>.
Указываем базовую точку, и наша программа нарисует куб. См. Рис. 24.
Рис. 24. Программа нарисовала куб.
Ура заработала!!!
Давайте снова вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 25.
Рис. 25. Все переменные имеют значение.
Мы видим, что все наши переменные имеют значения.
После того, как программа отлажена:
- Нужно вернуть все локальные переменные в список временных переменных функции defun.
- Сохранить свою LISP-программу.
- Закрыть редактор Visual LISP и AutoCAD, чтобы очистить все значения переменных. Этот шаг очень важен. Возможно, что некоторые переменные всё еще сохраняют присвоенные им значения.
Теперь давайте снова запустим AutoCAD и редактор Visual LISP. Откроем окно «Контрольное значение». Если переменные исчезли, то добавьте их снова. См. Рис. 26.
Рис. 26. Все переменные не имеют значений.
Мы видим, что все переменные не имеют значений.
Теперь давайте рассмотрим, как отслеживать значения переменных во время выполнения программы.
Для этого нам необходимо в программе поставить точки останова – места, в которых во время выполнения программа будет останавливаться.
Для этого помещаем курсор в то место программы, где мы хотели бы установить точку останова и нажимаем на кнопку «Точка останова вкл/выкл». См. Рис. 27.
Рис. 27. Точка останова.
Точка останова выделится красным.
Давайте добавим еще пару точек останова, загрузим программу и перейдем в AutoCAD. См. Рис. 28.
Рис. 28. Добавляем точки останова и загружаем программу.
Набираем в командной строке mp_kub. Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.
AutoCAD вернет нас в редактор Visual LISP, и мы увидим, что наша программа остановилась в первой точки останова. См. Рис. 29.
Рис. 29. Первая точка останова.
Обратим внимания на окно «Контрольное значение». В данной точки останова переменная р1 уже имеет текущее значение. Для продолжения программы нажимаем на кнопку «Продолжить». См. Рис. 30.
Рис. 30. Следующая точка останова.
Наша программа остановиться в следующей точке останова. В этой точке уже пять переменных будут иметь свои текущие значения.
Снова нажимаем на кнопку «Продолжить». См. Рис. 31.
Рис. 31. Последняя точка останова.
Программа остановиться в последней точке останова. В этой точке уже все переменные имеют свои текущие значения.
Для того чтобы завершить выполнение программы, снова нажимаем на кнопку «Продолжить».
В конце программы мы снова окажемся в AutoCAD, где будет нарисован куб. См. Рис. 32.
Рис. 32. Программа нарисовала куб.
Теперь давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 33.
Рис. 33. Все переменные не имеют значений.
По окончании программы все переменные снова не имеют значений.
Таким образом, используя точки останова и окно «Контрольное значение», можно отслеживать значения переменных в любой точке во время выполнения программы.
Чтобы удалить все точки останова по окончании работы с ними, нажмите клавиши <Shift>+<Ctrl>+<F9>.
И так в этом уроке мы рассмотрели основные приемы отладки программы AutoLISP.
К этим приемам относятся:
- Проверка фрагментов кода в окне «Консоль Visual LISP».
- Отслеживание парных кавычек.
- Поиск парных скобок в процессе и после написания кода.
- Использование окна «Контрольное значение»
Искренне надеюсь, что отладка программ AutoLISP стала для Вас теперь легкой, занимательной головоломкой.
Пишите в комментариях:
Была ли для Вас полезной информация, данная в этом уроке?
Какие способы отладки используете Вы?
На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?
Я с удовольствием отвечу на ваши комментарии.
Если вы хотите получать новости с моего сайта. Оформляйте подписку.
До новых встреч.
«Автор: Михаил Орлов»
Также на эту тему Вы можете почитать:
Перейти к содержимому раздела
Форумы CADUser
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Дерево сообщений Активные темы Темы без ответов
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
#1 10 августа 2006г. 12:32:29
- Julick
- Восстановленный участник
- На форуме с 10 августа 2006г.
- Сообщений: 32
- Спасибо: 0
Тема: Почему в строке vlax-safearray->list XDataType, возникают проблемы?
Посмотрите пожалйста на этот код. Почему вот в этой строчке (vlax-safearray->list XDataType) Лисп ругается. Что не так то?
(defun c:con () (vl-load-com) (setq old_echo (getvar "CMDECHO")) ;Получение указателя на объект AutoCADа (setq acad_object (vlax-get-acad-object)) ;Получение указателя на приложение (setq acad_app (vla-get-application acad_object)) ;Получение указателя на активный документ (setq active_doc (vla-get-activedocument acad_app)) ;(vlax-dump-object acad_app) ;Получение указателя на текущий Стиль (setq family_style (vla-get-DimStyles active_doc)) (vlax-dump-object family_style) (setq cnt (vla-get-count family_style) i 0) (while (< i cnt) (print "***************************************") (setq family_style_i (vla-item family_style i)) (vlax-dump-object family_style_i 1) (vla-getXData family_style_i "" 'XDataType 'XDataValue) (vlax-safearray->list XDataType) (setq i (1+ i)) );while |; (setvar "CMDECHO" old_echo) (princ) )
#2 Ответ от kpblc 10 августа 2006г. 12:49:44
- kpblc
- Активный участник
- Откуда: С.-Петербург
- На форуме с 29 ноября 2004г.
- Сообщений: 8,348
- Спасибо: 23
Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?
#3 Ответ от Julick 10 августа 2006г. 14:15:31
- Julick
- Восстановленный участник
- На форуме с 10 августа 2006г.
- Сообщений: 32
- Спасибо: 0
Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?
А зачем проверять границу массива, если все функции типа safearray вообще не воспринимают XDataType. Будьте добры, поясните, пожалуйста!
#4 Ответ от Пастух 10 августа 2006г. 14:25:50
- Пастух
- Восстановленный участник
- На форуме с 12 января 2005г.
- Сообщений: 461
- Спасибо: 0
Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?
Если расширенных данных у объекта нет, то
(vla-getXData family_style_i «» ‘XDataType ‘XDataValue)
ничего не поместит в переменные xdatatype и xdatavalue. И соответственно:
(vlax-safearray->list XDataType)
вернет ругательство:
; error: bad argument type: safearrayp nil
#5 Ответ от kpblc 10 августа 2006г. 14:39:35
- kpblc
- Активный участник
- Откуда: С.-Петербург
- На форуме с 29 ноября 2004г.
- Сообщений: 8,348
- Спасибо: 23
Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?
Хе, а они там есть? В размерных стилях-то? По-моему, их там нет. Проверка на существование:
(defun c:con (/ adoc 'xtype 'xvalue) (vl-load-com) (setq adoc (vla-get-activedocument (vlax-get-acad-object)) dimstyles (vla-get-dimstyles adoc) ) ;_ end of setq (vlax-for style dimstyles (vla-getxdata style vlax-vbnull 'xtype 'xvalue) (if (and xtype xvalue) (princ (strcat "nДля стиля " (vla-get-name style) " нет XData")) ) ;_ end of if ) ;_ end of vlax-for ) ;_ end of defun
#6 Ответ от kpblc 10 августа 2006г. 14:41:38
- kpblc
- Активный участник
- Откуда: С.-Петербург
- На форуме с 29 ноября 2004г.
- Сообщений: 8,348
- Спасибо: 23
Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?
В предыдущем коде ошибок как у дурака фантиков. Вроде как подправленный вариант:
(defun c:con (/ adoc xtype xvalue) (vl-load-com) (setq adoc (vla-get-activedocument (vlax-get-acad-object)) dimstyles (vla-get-dimstyles adoc) ) ;_ end of setq (vlax-for style dimstyles (vla-getxdata style "" 'xtype 'xvalue) (if (and xtype xvalue) (princ (strcat "nДля стиля " (vla-get-name style) " нет XData")) ) ;_ end of if ) ;_ end of vlax-for ) ;_ end of defun
#7 Ответ от Julick 10 августа 2006г. 18:36:07
- Julick
- Восстановленный участник
- На форуме с 10 августа 2006г.
- Сообщений: 32
- Спасибо: 0
Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?
Дело в том, что в этих стилях написано при выводе методов GetXData(3). Ведь 3 чего-то значит. Я так полагаю, что 3 означает количество расширенных данных. Или я ошибаюсь?
#8 Ответ от AY 10 августа 2006г. 21:52:09
- AY
- Восстановленный участник
- На форуме с 22 августа 2003г.
- Сообщений: 465
- Спасибо: 0
Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?
> Julick
Вроде бы числа при методах показывают количество аргументов принимаемых этими самыми методами.
#9 Ответ от Julick 14 августа 2006г. 13:01:25
- Julick
- Восстановленный участник
- На форуме с 10 августа 2006г.
- Сообщений: 32
- Спасибо: 0
Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?
Благодаря коду проверки (кстати спасибо) выяснилось, данные есть. Но в принципе их не могло не быть. Тогда в чем проблема то?
#10 Ответ от Эдуард Смолянка 14 августа 2006г. 16:06:53
- Эдуард Смолянка
- Восстановленный участник
- На форуме с 23 апреля 2003г.
- Сообщений: 795
- Спасибо: 0
Re: Почему в строке vlax-safearray->list XDataType, возникают проблемы?
Благодаря коду проверки (кстати спасибо) выяснилось, данные есть
KpbIc здесь опять поторопился (все с точностью до наоборот):
(if (and xtype xvalue) (princ (strcat "nДля стиля " (vla-get-name style) " нет XData")) ) ;_ end of if
Но в принципе их не могло не быть.
Вопрос: А кто их туда прицепил? По умолчанию их там быть не должно.
Всвязи с отсутствием РД переменная XDataType имеет значение nil.Отсюда и ошибка.
Замечания по Вашему коду
1.Вы не используете встроенные автокадовские команды -отключать cmdecho нет смысла.
2.(vla-get-application acad_object) и (vlax-get-acad-object) это одно и тоже.
3.Семейства обрабатываются функцией vlax-for без ввода лишних переменных (i,cnt)
4.Какой смысл использования функции vlax-dump-object ?
Сообщения 10
Тему читают: 1 гость
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Добро пожаловать!
Войдите или зарегистрируйтесь сейчас!
Войти
Страница 5 из 18
-
Форумчанин
а если их создать? по-моему где то встречал программку для этих целей…
посмотрел у Map3d тоже присутствует формат mrSid(*.sid) для вставки изображений#81
-
Форумчанин
- Регистрация:
- 15 июн 2012
- Сообщения:
- 613
- Симпатии:
- 84
- Адрес:
-
Краснодар
в глобал мапер открыл — и о чудо все файлы как то открываються именно на своих местах (как для меня великая загадка)
Остался вопрос как всё это чудо в автокад затянуть (если это возможно в обще) , если же нет то как перебить формат всему этому набору растров ?#82
-
Форумчанин
Файл —> Экспорт растра —> выбор необходимого формата
#83
-
Форумчанин
- Регистрация:
- 15 фев 2011
- Сообщения:
- 501
- Симпатии:
- 302
Файл-экспорт растра- выбираете нужный формат для экспорта и ставите галочку «создать файл привязки». Полученный файл привязки указываете через лисп Disney’я.
Часто бывает полезно разбить растр на части. Для этого там же в настройках экспорта есть настройка сетки (указываете количество столбцов и строк).#84
-
Форумчанин
- Регистрация:
- 15 июн 2012
- Сообщения:
- 613
- Симпатии:
- 84
- Адрес:
-
Краснодар
огромное спасибо — буду пробывать
#85
-
Форумчанин
- Регистрация:
- 23 ноя 2010
- Сообщения:
- 49
- Симпатии:
- 1
При подгрузке растра выдает ошибку (ошибка: неверный тип аргумента: stringp nil)
Текст таб файла:
!Table
!Version 300
!Charset NeutralDefinition Table
File «62-2-239-120-А.tif»
Type «RASTER»
(2240000.000000, 480000.000000) (0, 0) Label «Pt 1»,
(2241000.000000, 480000.000000) (4000, 0) Label «Pt 2»,
(2241000.000000, 479000.000000) (4000, 4000) Label «Pt 3»,
(2240000.000000, 479000.000000) (0, 4000) Label «Pt 4»
CoordSys NonEarth Units «m» Bounds (2240000.000000, 479000.000000) (2241000.000000, 480000.000000)
Units «m»Вложения:
#86
-
Форумчанин
- Регистрация:
- 15 фев 2011
- Сообщения:
- 501
- Симпатии:
- 302
У меня несколько предположений:
1. Текущий слой на замке. Решается отключением блокировки.
2. Расширение самого растра не тиф, а бмп. Решается заменой расширения в файле привязки.
3. Имя растра отличается, например вместо 62-2-239-120-А имя 62-2-239-120-а. Решается групповым переименованием в Тотал Командере.
Если файл не большой, то выкладывайте сам растр.#87
-
Форумчанин
- Регистрация:
- 30 ноя 2007
- Сообщения:
- 2.704
- Симпатии:
- 2.444
- Адрес:
-
Сибирь
Илюха, надо всю связку, выложи и сам растр.
#88
-
Форумчанин
- Регистрация:
- 23 ноя 2010
- Сообщения:
- 49
- Симпатии:
- 1
Выкладываю файлы
Вложения:
-
RASTR.rar
- Размер файла:
- 9,4 МБ
- Просмотров:
- 42
#89
-
- Регистрация:
- 6 фев 2013
- Сообщения:
- 4
- Симпатии:
- 0
При попытке вставить растры получил такое:
Команда: (Geo_load_image T) ; ошибка: Ошибка Automation. Недопустимый ключ
Версия 2.1. Акад 2012
При этом, если запускать команду и выбирать/загружать растр по одному, все вставляется, а если кучей, то нет#90
-
Форумчанин
- Регистрация:
- 30 ноя 2007
- Сообщения:
- 2.704
- Симпатии:
- 2.444
- Адрес:
-
Сибирь
В файле лишние пробелы(в каждой строчкой перед Label, должен быть «один», а их там «два»), удали один, или скопируй ранее выложенное тобой содержимое файла tab на форуме(движок форума удаляет более одного пробела подряд), то всё заработает.
#91
-
- Регистрация:
- 6 фев 2013
- Сообщения:
- 4
- Симпатии:
- 0
Проблема оказалась в том, что в названии файлов присутствовали «запятые» — удалил их и пакетная вставка заработала… хотя странно — по одиночке вставлялось, а кучей нет..
#92
-
Форумчанин
- Регистрация:
- 27 фев 2012
- Сообщения:
- 29
- Симпатии:
- 1
- Адрес:
-
Москва
Сейчас опять столкнулся с той же проблемой при создании привязки растра в TAB:
пишет:
; ошибка: неверный тип аргумента: streamp nil
Долго вспомнилал, что когда-то решил эту проблему и вспомнил)
Вы были правы, Disney, там проблем в прописанной директории к растру. Подрядчик прислал файл Dwg с растрами в одной папке. А директория прописанная осталась старая с его компа, типа Z:/растры/топо/растр1.tiff
В итоге проблема решается обновлением директории, чтобы она совпадала с фактическим расположением файла на моём компьютере. Тогда всё работает.#93
-
- Регистрация:
- 15 мар 2013
- Сообщения:
- 2
- Симпатии:
- 0
-
Форумчанин
Dashiva, желательно, что бы растр лежал в той папке, где и сам файл находится. И, при вставке растра в файл, при задании пути выбрать пункт без пути.
#95
-
Форумчанин
- Регистрация:
- 16 июн 2008
- Сообщения:
- 35
- Симпатии:
- 0
- Адрес:
-
Москва
Disney, подскажите пожалуйста, — корректно ли работает Ваша программа с AutoCad 2008 SP1 (англ. версия)? Вроде бы программа устанавливается, но команды в командной строке не срабатывают. Может быть проблема в каких-либо настройках?
#96
-
Форумчанин
- Регистрация:
- 20 июн 2013
- Сообщения:
- 46
- Симпатии:
- 5
Доброго времени суток !Сложилась такая ситуация — при вставке растрового изображения выбираю папку где оно расположено, а Автокад выдает фатальную ошибку.С чем это может быть связано и как это исправить ? Спасибо
#97
-
- Регистрация:
- 19 окт 2013
- Сообщения:
- 1
- Симпатии:
- 0
Подскажите, пожалуйста в чем у меня проблема с подгрузкой. Использую команду (Geo_load_image «One») после выбора растра с привязкой tab (см. вложение) ACad виснит (не отвечает). И так более двух часов… и т.д…. может я мало жду? Версию программы использую 2.1.
Вложения:
-
493.rar
- Размер файла:
- 1,2 МБ
- Просмотров:
- 9
#98
-
Форумчанин
- Регистрация:
- 26 окт 2013
- Сообщения:
- 16
- Симпатии:
- 38
- Адрес:
-
Самара
Всем доброго времени суток. Имеется привязанный растр (*.tif+*.tab). Можно как-нить использовать tab, чтобы растр лег туда, куда он и привязан? Если делать через вставка-вхождение растрового изображения , то нужно либо указывать координаты точки вставки либо посредством указания на экране, либо непосредственно ввод с клавиатуры. Получается, что файл привязки tab не используется…
Решение: программа в 18 постеЗдравствуйте. Отлично работает штука! я так понял, что она преобразовывает в СК95, если геопривязка в WGS… а возможно реализовать преобразование в МСК по известным параметрам перехода?
#99
-
Команда форума
Форумчанин- Регистрация:
- 18 май 2007
- Сообщения:
- 21.480
- Симпатии:
- 6.873
- Адрес:
-
Россия
Приложение в автозагрузке, какой командой вызвать не понимаю. Make находит. Автокад 2013
#100
Страница 5 из 18
Поделиться этой страницей
Мне пришлось изменить стили текста и атрибуты ширины нескольких блоков в Autocad. Было 10-30 блоков на каждого dwg и почти 100 dgg, и я не мог потрудиться вручную конвертировать каждый блок в новый стандарт.
https: // forums.autodesk.com/t5/visual-lisp-autolisp-and-general/attribute-width-change/td-p/1525357 по этой ссылке есть скрипт для изменения ширины всех блоков (блоков заголовков и нескольких электрических символов) на 1, и в качестве первого прохода он делает то, что я хочу (сбой из-за bad ; error: bad argument type: lentityp nil Command:
, который после его изменения выбирается вручную и просто выбирается блоки, которые я хочу исправить это). Однако мне также нужно изменить стиль теста с того, что он есть, на «Стандарт» https://www.afralisp.net/reference/dxf-group-codes. PHP После проверки этой ссылки я обнаружил, что «Имя стиля текста» — это код dxf 7 поэтому я изменил сценарий к следующему.
(defun C:StandardFromDWGTEXT (/ ss sslen cnt blck ent entinfo)
(setq ss (ssget))
(setq cnt 0)
(setq sslen (sslength ss))
(while (< cnt sslen)
(setq blck (ssname ss cnt))
(setq ent (entnext blck))
(setq entinfo (entget ent))
(while
(and ent (= (cdr (assoc 0 entinfo)) "ATTRIB"))
(entmod (subst (cons 41 1) (assoc 41 entinfo) entinfo))
;;; (entupd ent)
;;; (setq ent (entnext ent))
;;; (setq entinfo (entget ent))
(entmod (subst (cons 7 "Standard") (assoc 7 entinfo) entinfo))
(entupd ent)
(setq ent (entnext ent))
(setq entinfo (entget ent))
)
(setq cnt (1+ cnt))
)
(princ)
)
Теперь он работает только с закомментированными строками (перестает работать с ними, но это также означает, что он меняет только стиль текста, а не ширину) и только половина раза меняет стиль текста. Мне удалось пройти через все файлы, перезагружая auto-cad произвольно, а иногда, когда он не работал (не работает, значит, ничего не меняется, когда я этого ожидаю), открывая скрипт в визуальном редакторе lisp и нажимая на окно load active, исправляет его. Я бы положил это рядом со мной, но в интересах обучения, и, поскольку мне уже приходилось менять стандарт дважды, есть большая вероятность, что мне придется сделать это снова, я хочу попытаться это исправить.
Учитывая то, что сценарий с простым изменением ширины на 1 работает 100% времени, я решил, что проблема не в том, чтобы добавить его в набор автозагрузки / открыть его в редакторе визуальных шрифтов, а скорее в моем добавлении к самому коду. Однако строка, которую я добавил, чтобы изменить стиль текста (entmod (subst (cons 7 "Standard") (assoc 7 entinfo) entinfo))
не отличается от строки для изменения ширины текста.
Если у кого-то есть понимание, я буду признателен. У меня есть опыт работы с другими языками программирования, но я начинающий, когда дело доходит до Autolisp / lisp.
2 ответа
Лучший ответ
Есть несколько проблем, которые могут испортить ваш код:
-
(setq ss (ssget))
Без аргумента списка фильтров, разрешающего только приписанные блоки, ваш выбор может включать любой тип сущности, то есть вызов
entnext
вернет вызовnil
для любых объектов без субтитр. Следовательно, вызовentget
вернет следующую ошибку, свидетелем которой вы являетесь:ошибка: неверный тип аргумента: lentityp nil
Решение состоит в том, чтобы включить список фильтров, чтобы разрешить только выбор приписанных блоков:
(setq ss (ssget "_:L" '((0 . "INSERT") (66 . 1))))
Строка режима
_:L
также исключает объекты на заблокированных слоях. -
(setq sslen (sslength ss))
Без проверки правильности выбора переменная
ss
может бытьnil
, что приведет к(sslength ss)
возвращению ошибки:ошибка: неверный тип аргумента: lselsetp nil
-
(entmod (subst (cons 41 1) (assoc 41 entinfo) entinfo))
(entmod (subst (cons 7 "Standard") (assoc 7 entinfo) entinfo))
Здесь второе
subst
выражение заменяет группу 7 DXF в оригинале списке данных DXF, а не данные DXF, которые были изменены после замены группы 41 DXF. Это приведет к обращению изменения коэффициента ширины.
Внедрение исправлений для вышеуказанных проблем (и несколько других изменений) может привести к следующему коду:
(defun c:standardfromdwgtext ( / a i s x )
(if (setq s (ssget "_:L" '((0 . "INSERT") (66 . 1))))
(repeat (setq i (sslength s))
(setq i (1- i)
a (entnext (ssname s i))
x (entget a)
)
(while (= "ATTRIB" (cdr (assoc 0 x)))
(if (entmod (subst '(41 . 1.0) (assoc 41 x) (subst '(7 . "Standard") (assoc 7 x) x)))
(entupd a)
)
(setq a (entnext a)
x (entget a)
)
)
)
)
(princ)
)
2
Lee Mac
13 Авг 2019 в 20:43
Ошибка
плохой ; ошибка: неверный тип аргумента: lentityp nil
Является результатом использования пустой переменной для сущности.
Когда вы используете (setq ent (entnext blck))
, вам следует проверить, не равен ли ему ноль.
(setq ent (entnext blck))
(if ent
(progn
(setq entinfo (entget ent))
При устранении неполадок AutoLisp, когда вы видите lentityp или stringp = nil, тогда используемая вами переменная была установлена на nil, и вам нужно найти, где и почему.
0
mtaussie
13 Авг 2019 в 20:48