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

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

Почему код dxf 370 не возвращает веса линии?

Ответ
Поиск в этой теме
Непрочитано 01.12.2022, 13:29 #1
Почему код dxf 370 не возвращает веса линии?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,079

Задача: получить значение веса линии у выбранного объекта и назначить полученный вес линии текущим.
Применяю код ЛИСП
Код:
[Выделить все]
 
(setq cLWeight0 (assoc 370 dan))
(setq cLWeight (cdr cLWeight0))
Однако переменная cLWeight получает значение nil
Какой надо использовать код DXF чтобы получить вес линии?
Просмотров: 2329
 
Непрочитано 01.12.2022, 13:51
1 | #2
name02


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


Насколько помню, если вес линий "послою" 370 код отсутствует, "поблоку" равен -2, для установленных значений весов уже будет присутствовать
Попробуй (entget(car(entsel))) и посмотри различия
name02 вне форума  
 
Непрочитано 01.12.2022, 14:12
1 | #3
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 463


Выведи на экран весь список dan и посмотри, есть ли он там вообще.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 02.12.2022, 04:53
#4
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Спасибо за ответы! Задал вес линии 0,05. Получил cLWeight =5.
Далее пытаюсь назначить тикущий вес линий и надо перед этим получить cLWeight =0.05. Но не удается получить 0.05
Почему код
Код:
[Выделить все]
 
(setq cLWeight  5)
(setq cLWeight (/ cLWeight 100))
Возвращает 0?
Что надо сделать чтобы получалось 0.05?
МишаИнженер вне форума  
 
Непрочитано 02.12.2022, 05:59
1 | #5
name02


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


Дело в том, что для компьютера есть несколько разных типов чисел. В частности есть числа типа REAL и типа INTEGER.
Числа типа INTEGER имеют только целую часть, а REAL - "обычные" числа с дробной частью (она может быть равна 0).
Соответственно Lisp по разному работает с ними, что собственно у тебя и произошло:
Код:
[Выделить все]
 
(setq cLWeight  5) ;указав здесь 5, ты задал тип данных INTEGER

(print (type cLWeight)) ;что и видно

;чтобы задать число типа REAL, нужно указывать число с десятичной точкой (или с дробной частью)
(setq cLWeight  5.)

;Проверяем
(print (type cLWeight))
Потом ты опять-таки делишь свое число на INTEGER и получаешь INTEGER.

Положи себе в закладки ссылку на справку Автодеска по Lisp и не забывай в нее смотреть
name02 вне форума  
 
Непрочитано 02.12.2022, 06:04
#6
remoteworker


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


acLnWt005

Последний раз редактировалось remoteworker, 02.12.2022 в 06:06. Причина: ответил не в ту тему
remoteworker вне форума  
 
Автор темы   Непрочитано 02.12.2022, 06:24
#7
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Мне надо присвоить системной переменной "CELWEIGHT" присвоить толщину линий 0,05
Вместо 0,05 надо указывать 5
Но не получается:
Код:
[Выделить все]
 
(setvar "CELWEIGHT" cLWeight)
Что значит ошибка выполнения: "; ошибка: неверный тип аргумента: stringp 5"
Строка
Код:
[Выделить все]
 
(setvar "CELWEIGHT" (rtos cLWeight))
Тоже выдает ошибку: "; ошибка: Настройка переменной AutoCAD отвергнута: "CELWEIGHT" "5""
Как на ЛИСП присвоить системной переменной CELWEIGHT значение 5?

Последний раз редактировалось МишаИнженер, 02.12.2022 в 06:40.
МишаИнженер вне форума  
 
Непрочитано 02.12.2022, 06:33
1 | #8
remoteworker


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


(setvar "CELWEIGHT" acLnWt005)
remoteworker вне форума  
 
Непрочитано 02.12.2022, 06:57
#9
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 463


Здесь

(setvar "CELWEIGHT" (rtos cLWeight))

rtos - лишнее.

Ты пытаешься засунуть в эту системную переменную СТРОКУ
(т.е. текстовое значение числа), а она хочет именно ЧИСЛО.

Для LISP'а это три разных значения

5 - целое число
5.0 - действительное число
"5" или "5.0" - текстовая строка

Человеку - без разницы, компьютеру - нет.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 02.12.2022, 07:02
#10
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Цитата:
Сообщение от remoteworker Посмотреть сообщение
(setvar "CELWEIGHT" acLnWt005)
Добавил такую строку в код программы и изучил разницу между acLnWt005 и цифрой 5. Разницы не нашлось.
Но на присвоении цифры 5 возникает ошибка. Почему это происходит? И чем отличается acLnWt005 от цифры 5?
Код:
[Выделить все]
 
(while (setq el (car (entsel "\n Выбери объект:")))
;entsel выдает имя объекта и все остальное, car - Извлекает первый элемент из списка: имя объекта
;команды которые должны выполняться в цикле пока не будет пустой ввод
  (setq dan (entget el));получает список с характеристиками примитива
  (setq name0 (assoc 0 dan)) ;получаем имя объекта
  (setq name (cdr name0))
  (princ name)
  (alert (strcat "Был выбран " name))
  (setq cLayer0 (assoc 8 dan)) ;получаем имя объекта
  (setq cLayer (cdr cLayer0))
  (setq cLWeight0 (assoc 370 dan)) ;получаем текущий вес линии
  (setq cLWeight (cdr cLWeight0))
  
;Назначим текущим слой выбранного объекта (setvar "clayer" <имя слоя>)
  (setvar "clayer" cLayer)
  (princ (strcat (chr 10) "Был назначен текущий слой " (chr 34) cLayer (chr 34)))
;Назначим текущий вес линий
  (if (eq cLWeight nil) (progn
	(setvar "CELWEIGHT" -1)
	(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоСлою" (chr 34)))
	)
	(progn
	(setvar "CELWEIGHT" acLnWt005)
	(setvar "CELWEIGHT" (rtos cLWeight))
	(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) cLWeight (chr 34)))
	)
   )
;В зависимости от выбранного объекта
; (findstring
)
МишаИнженер вне форума  
 
Непрочитано 02.12.2022, 07:11
#11
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 463


(setvar "CELWEIGHT" acLnWt005)
(setvar "CELWEIGHT" (rtos cLWeight))

Не, ну нормально!

Сперва ты пытаешься засунуть несуществующую переменную acLnWt005,
а потом туда же всунуть текстовую строку. :-)
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 02.12.2022, 07:51
#12
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Такой вариант тоже не работает
Код:
[Выделить все]
 
	(setvar "CELWEIGHT" acLnWt005)
	(setvar "CELWEIGHT" cLWeight)
Выдает ошибку: "; ошибка: неверный тип аргумента: stringp 5"
Код:
[Выделить все]
 
(while (setq el (car (entsel "\n Выбери объект:")))
;entsel выдает имя объекта и все остальное, car - Извлекает первый элемент из списка: имя объекта
;команды которые должны выполняться в цикле пока не будет пустой ввод
  (setq dan (entget el));получает список с характеристиками примитива
  (setq name0 (assoc 0 dan)) ;получаем имя объекта
  (setq name (cdr name0))
  (princ name)
  (alert (strcat "Был выбран " name))
  (setq cLayer0 (assoc 8 dan)) ;получаем имя объекта
  (setq cLayer (cdr cLayer0))
  (setq cLWeight0 (assoc 370 dan)) ;получаем текущий вес линии
  (setq cLWeight (cdr cLWeight0))
  
;Назначим текущим слой выбранного объекта (setvar "clayer" <имя слоя>)
  (setvar "clayer" cLayer)
  (princ (strcat (chr 10) "Был назначен текущий слой " (chr 34) cLayer (chr 34)))
;Назначим текущий вес линий
  (if (eq cLWeight nil) (progn
	(setvar "CELWEIGHT" -1)
	(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоСлою" (chr 34)))
	)
	(progn
	(setvar "CELWEIGHT" acLnWt005)
	(setvar "CELWEIGHT" cLWeight)
	(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) cLWeight (chr 34)))
	)
   )
)
МишаИнженер вне форума  
 
Непрочитано 02.12.2022, 07:55
#13
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 463


Ну давай смотреть, что там такое.

Перед:

(setvar "CELWEIGHT" cLWeight)

Пиши:

(print cLWeight)
(print (type cLWeight))

Что выводят команды (print) ?

Но у тебя просто вылетает на

(setvar "CELWEIGHT" acLnWt005)

ну нет же такой переменной! Убери эту строку или закомментируй.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 02.12.2022, 08:08
#14
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


acLnWt005 это внутренне определения веса линии толщиной 0,05.
Строка (setvar "CELWEIGHT" cLWeight) отрабатывает нормально.
В следующей строке я назначаю вместо acLnWt005 число 5 так как если в командную строку после команды CELWEIGHT ввести число 5 то Акад нормально понимает, что текущая толщина линий 0,05.
А вот на лиспе просто указать число 5 не проходит появляется ошибка.
Получается надо создать функцию находящую соответствие между значением cLWeight и внутренними константами: (acLnWt000 acLnWt005 acLnWt009 acLnWt013 acLnWt015 acLnWt018 acLnWt020 acLnWt025 acLnWt030 acLnWt035 acLnWt040 acLnWt050 acLnWt053 acLnWt060 acLnWt070 acLnWt080 acLnWt090 acLnWt100 acLnWt106 acLnWt120 acLnWt140 acLnWt158 acLnWt200 acLnWt211)
И затем уже эту константу указывать "вместо числа 5"
Но как написать такую функцию?
Попробовал поменять функцию:
Код:
[Выделить все]
 
(while (setq el (car (entsel "\n Выбери объект:")))
;entsel выдает имя объекта и все остальное, car - Извлекает первый элемент из списка: имя объекта
;команды которые должны выполняться в цикле пока не будет пустой ввод
  (setq dan (entget el));получает список с характеристиками примитива
  (setq name0 (assoc 0 dan)) ;получаем имя объекта
  (setq name (cdr name0))
  (princ name)
  (alert (strcat "Был выбран " name))
  (setq cLayer0 (assoc 8 dan)) ;получаем имя объекта
  (setq cLayer (cdr cLayer0))
  (setq cLWeight0 (assoc 370 dan)) ;получаем текущий вес линии
  (setq cLWeight (cdr cLWeight0))
  
;Назначим текущим слой выбранного объекта (setvar "clayer" <имя слоя>)
  (setvar "clayer" cLayer)
  (princ (strcat (chr 10) "Был назначен текущий слой " (chr 34) cLayer (chr 34)))
;Назначим текущий вес линий
  (cond ((eq cLWeight nil)
		(setvar "CELWEIGHT" -1)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоСлою" (chr 34)))
		)
	((eq cLWeight -2)
		(setvar "CELWEIGHT" -2)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоБлоку" (chr 34)))
		)
	((eq cLWeight -3)
		(setvar "CELWEIGHT" -3)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоУмолчанию" (chr 34)))
		)
	(1 
		(setvar "CELWEIGHT" cLWeight)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) (rtos (/ cLWeight 100.0)) (chr 34)))
	)
   )
)
Вот так все заработало
Миниатюры
Нажмите на изображение для увеличения
Название: Отрабатывает acLnWt005.png
Просмотров: 9
Размер:	33.9 Кб
ID:	251660  

Последний раз редактировалось МишаИнженер, 02.12.2022 в 09:06.
МишаИнженер вне форума  
 
Непрочитано 02.12.2022, 08:50
#15
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 463


Господи, зачем сложно-то так?
Получил вес линии из примитива - ну и закидывай его в CELWEIGHT.
Хоть 5, хоть 5.0 - через (setvar ) любое сгодится, кроме "5.0" /текст/.
Зачем здесь вообще эти внутренние переменные?

И да - эта 5 сразу же будет соответствовать 0,05 - ничего дополнительно
преобразовывать не нужно.
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 02.12.2022 в 09:08.
===AAA=== вне форума  
 
Непрочитано 02.12.2022, 09:14
#16
Кулик Алексей aka kpblc
Moderator

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


Пока печатал, код был изменен.

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
acLnWt005 это внутренне определения веса линии толщиной 0,05.
Строка (setvar "CELWEIGHT" cLWeight) отрабатывает нормально.
В следующей строке я назначаю вместо acLnWt005 число 5 так как если в командную строку после команды CELWEIGHT ввести число 5 то Акад нормально понимает, что текущая толщина линий 0,05.
А вот на лиспе просто указать число 5 не проходит появляется ошибка.
Получается надо создать функцию находящую соответствие между значением cLWeight и внутренними константами: (acLnWt000 acLnWt005 acLnWt009 acLnWt013 acLnWt015 acLnWt018 acLnWt020 acLnWt025 acLnWt030 acLnWt035 acLnWt040 acLnWt050 acLnWt053 acLnWt060 acLnWt070 acLnWt080 acLnWt090 acLnWt100 acLnWt106 acLnWt120 acLnWt140 acLnWt158 acLnWt200 acLnWt211)
И затем уже эту константу указывать "вместо числа 5"
Но как написать такую функцию?
Попробовал поменять функцию:
Код:
[Выделить все]
 
(while (setq el (car (entsel "\n Выбери объект:")))
;entsel выдает имя объекта и все остальное, car - Извлекает первый элемент из списка: имя объекта
;команды которые должны выполняться в цикле пока не будет пустой ввод
  (setq dan (entget el));получает список с характеристиками примитива
  (setq name0 (assoc 0 dan)) ;получаем имя объекта
  (setq name (cdr name0))
  (princ name)
  (alert (strcat "Был выбран " name))
  (setq cLayer0 (assoc 8 dan)) ;получаем имя объекта
  (setq cLayer (cdr cLayer0))
  (setq cLWeight0 (assoc 370 dan)) ;получаем текущий вес линии
  (setq cLWeight (cdr cLWeight0))
  
;Назначим текущим слой выбранного объекта (setvar "clayer" <имя слоя>)
  (setvar "clayer" cLayer)
  (princ (strcat (chr 10) "Был назначен текущий слой " (chr 34) cLayer (chr 34)))
;Назначим текущий вес линий
  (cond ((eq cLWeight nil)
		(setvar "CELWEIGHT" -1)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоСлою" (chr 34)))
		)
	((eq cLWeight -2)
		(setvar "CELWEIGHT" -2)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоБлоку" (chr 34)))
		)
	((eq cLWeight -3)
		(setvar "CELWEIGHT" -3)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) "ПоУмолчанию" (chr 34)))
		)
	(1 
		(setvar "CELWEIGHT" cLWeight)
		(princ (strcat (chr 10) "Был назначен текущий вес линий " (chr 34) (rtos (/ cLWeight 100.0)) (chr 34)))
	)
   )
)
Вот так все заработало
Хоть убей не понимаю пары вещей. Первое - на фига там while. Второе - что будет, когда пользователь нажмет Esc в момент выбора

----- добавлено через ~10 мин. -----
Код:
[Выделить все]
 (defun t1 (/ ent)
  (if (= (type
           (setq ent (vl-catch-all-apply (function (lambda () (car (entsel "\nВыберите объект <Отмена> : "))))))
         ) ;_ end of type
         'ename
      ) ;_ end of =
    (progn
      (setq ent (entget ent))
      (setvar "celweight"
              (cond ((cdr (assoc 370 ent)))
                    (t (cdr (assoc 370 (entget (tblobjname "layer" (cdr (assoc 8 ent)))))))
              ) ;_ end of cond
      ) ;_ end of setvar
      (princ (strcat "\nУстановлен вес линии "
                     (cond
                       ((= (getvar "celweight") -3) "\"По умолчанию\"")
                       ((= (getvar "celweight") -2) "\"По блоку\"")
                       (t (rtos (/ (getvar "celweight") 100.) 2 2))
                     ) ;_ end of cond
             ) ;_ end of strcat
      ) ;_ end of princ
    ) ;_ end of progn
  ) ;_ end of if
  (princ)
) ;_ end of defun
ИМХО так будет проще
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.12.2022, 09:27
#17
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Получил вес линии из примитива - ну и закидывай его в CELWEIGHT.
Ветвление необходимо для вывода отчета о назначенном значении в текстовом виде.
Программа постоянно отчитывается о том, что она назначает.
Это очень удобно и коммуникабельно. Легко потом в листинге проверить что было назначено.

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
на фига там while
Пользователь может ошибочно выбрать не тот объект, по которому ему надо настроить чертежные настройки. Если он захочет выбрать ещё раз нужный объект у него есть для этого возможность. Можно выбирать сколько угодно пока не выбрать пустоту экрана или нажать ESC (это тоже работает, проверял).
В вашем коде немного мне понятно на 35%. Спасибо! Потом наверное разберусь получше.
МишаИнженер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Почему код dxf 370 не возвращает веса линии?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу помощи, при изменении веса линии ничего не меняется и мерцает перекрестие (Autocad 2017) lopikolper AutoCAD 10 26.06.2018 14:59
Почему я делаю в автокаде линии триховые или оевые штрихпунктирные, а распечватываются сплошные?? st7044 AutoCAD 8 21.06.2011 22:18
Почему при проставлении длины дуги линии выноски иногда идут по радиусам окружности, а иногда параллельны друг другу? stumpel AutoCAD 2 16.06.2011 15:46
Непонятные линии призраки вновь, почему dextron3 AutoCAD 11 24.03.2009 20:25
Почему field возвращает координаты объекта только в мировой системе координат? stumpel AutoCAD 7 20.02.2009 12:43