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

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

Как создать набор из блоков двух типов? Помогите откорректировать программу.

Ответ
Поиск в этой теме
Непрочитано 13.01.2020, 16:17
Как создать набор из блоков двух типов? Помогите откорректировать программу.
Сет
 
Регистрация: 19.11.2014
Сообщений: 2,606

Пользуюсь не своей программой по подсчету массы элементов в спецификации. Каждая строка спецификации - это блок с атрибутами. Среди прочих атрибутов есть такие, где хранятся данные о "Количестве" и "Массе единицы". Программа формирует набор из блоков и проходит по каждому блоку, считывая "Количество" и "Массу единицы", перемножает их и суммирует.

Вот как выглядит полный текст программы:

Код:
[Выделить все]
 (defun c:cs_calculate_weight (/ ss sorted ss_length i block attributes attribute sum_weight weight nof)  
(if (= (type (setq ss (vl-catch-all-apply (function (lambda () (ssget '((2 . "СпецСтр")))))))) 'pickset)
	(setq sorted (vl-sort (
		(lambda (/ tab item)
			(repeat
			        (setq tab  nil
				item (sslength ss)
				) ;_ end setq
				(setq tab (cons (ssname ss (setq item (1- item))) tab))
			) ;_ end repeat
		) ;_ end of LAMBDA
		)
		(function (lambda (a b) (> (caddr (assoc 10 (entget a))) (caddr (assoc 10 (entget b))))))
	)) ;_ end of vl-sort
) ;_ end of if
(setq ss_length (sslength ss))
(setq sum_weight 0) 
(setq i 0)
(repeat ss_length
	(setq block (vlax-ename->vla-object (nth i sorted)))
	(setq attributes (vlax-variant-value (vla-GetAttributes block)))
	(setq nof (atof (vl-string-translate "," "." (vla-get-TextString (vlax-safearray-get-element attributes 3)))))
        (setq weight (atof (vl-string-translate "," "." (vla-get-TextString (vlax-safearray-get-element attributes 4)))))
	(setq sum_weight (+ sum_weight (* nof weight)))
	(setq i (1+ i))
) ; repeat
(princ (strcat "Общая масса: " (rtos sum_weight)))
(alert (strcat "Общая масса: " (rtos sum_weight)))
(princ)  
) ; defun
Имя блоков строк спецификации - "СпецСтр". Сейчас мне нужно в набор блоков включить еще один - "СпецСтрИзд". Он отличается от "СпецСтр" только взаимным расположением атрибутов. Как я понимаю набор из блоков формируется в этом фрагменте кода:

Код:
[Выделить все]
 (if (= (type (setq ss (vl-catch-all-apply (function (lambda () (ssget '((2 . "СпецСтр")))))))) 'pickset)
	(setq sorted (vl-sort (
		(lambda (/ tab item)
			(repeat
			        (setq tab  nil
				item (sslength ss)
				) ;_ end setq
				(setq tab (cons (ssname ss (setq item (1- item))) tab))
			) ;_ end repeat
		) ;_ end of LAMBDA
		)
		(function (lambda (a b) (> (caddr (assoc 10 (entget a))) (caddr (assoc 10 (entget b))))))
	)) ;_ end of vl-sort
) ;_ end of if
Как мне в этот набор добавить еще и "СпецСтрИзд"?
Просмотров: 6406
 
Непрочитано 23.01.2020, 08:17
#41
===AAA===


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


Цитата:
просто по нормальному не должно быть ожидания ввода от пользователя во время работы с файлом, либо серьезно обкручивать интерфейс проверками.
И в обработчике ошибок принудительное закрытие открытых
файлов тоже не грех сделать...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 23.01.2020, 09:19
#42
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Плюс еще переопределяете стандартные функции своими переменными
То, что я использую переменную с таким именем (type) - может влиять на что-то?

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
просто по нормальному не должно быть ожидания ввода от пользователя во время работы с файлом, либо серьезно обкручивать интерфейс проверками.
Простого пути здесь нет? Вот в том же С++ я бы обернул код такой оболочкой:
Код:
[Выделить все]
 try
{
//исполняемый код
}
catch (...)
{
//обработка любых возникаемых ошибок
}
и это бы перехватывало все возможные ошибки. В обработчике можно было бы поставить освобождение занимаемой памяти, закрытие файлов и т.д. Не знаю как такое в лиспе сделать.
Сет вне форума  
 
Непрочитано 23.01.2020, 09:48
#43
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Сет Посмотреть сообщение
Не знаю как такое в лиспе сделать.
Использование функции vl-catch-* (vl-catch-all-apply и т.д.).
Offtop: Вот видите, вы уже знаете - как обрабатывали бы ошибки в C# (аналогичные конструкции либо использование using, которая по сути упрощенная запись try... внутри себя). А лисп - вы даже не знаете, куда смотреть в справку, судя по вопросам.

----- добавлено через ~14 мин. -----
Цитата:
Сообщение от Сет Посмотреть сообщение
То, что я использую переменную с таким именем (type) - может влиять на что-то?
просто не используйте зарезервированные слова для имен переменных/функций - если можно обойтись без этого. В других языках на это сразу бы ругаться начал еще редактор среды разработки скорее всего, лисп "доверяет" программисту)
Сергей812 вне форума  
 
Непрочитано 23.01.2020, 10:06
#44
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ciril, type - зарезервированное слово.
Поэтому можно только порадоваться за того, кто писал cs_numeration: зарезервированный символ использовал в качестве переменной и оставил в качестве глобальной.
Потому как, кроме здравого смысла и общих параметров среды ничего не может помешать написать вот так:
Код:
[Выделить все]
 ((lambda (fun args) (fun args))
 (lambda (args) (and args (print (list (setq set (car args)) (set 2 8))) (fun (cdr args))))
 (list + - * /))
А если vlide не запускать, а лисп с подобным просто загружать, то и параметры среды не помогут.
__________________
На работе было скучно:shout:

Последний раз редактировалось ciril, 23.01.2020 в 10:13.
ciril вне форума  
 
Непрочитано 23.01.2020, 10:10
#45
===AAA===


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


Цитата:
Не знаю как такое в лиспе сделать.
Еще можно *error* переопределить.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 23.01.2020, 10:14
#46
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
просто не используйте зарезервированные слова для имен переменных/функций - если можно обойтись без этого
Ну у меня просто очень поверхностные знания по лиспу, никогда не было необходимости его изучать углубленно. И эти функции во многом писал по подсказкам, по-моему даже на этом форуме. Ну, свое что-то добавлял только. Так что такие косяки с объявлением глобальных переменных, когда это не нужно, а также с использованием зарезервированных символов - в моем случае более чем возможно
Сет вне форума  
 
Непрочитано 23.01.2020, 10:24
#47
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Цитата:
Сообщение от Сет Посмотреть сообщение
То, что я использую переменную с таким именем (type) - может влиять на что-то?
После присвоения символу значения - при вычисления символа используется присвоенное значение.
Если символ локальный, то в функции, в которой он локальный. А если глобальный - то во всем сеансе акада.
Вы, чтобы на такие грабли не наступать, почитайте первые несколько глав Полещука.
__________________
На работе было скучно:shout:
ciril вне форума  
 
Автор темы   Непрочитано 23.01.2020, 10:32
#48
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Цитата:
Сообщение от ciril Посмотреть сообщение
Если символ локальный, то в функции, в которой он локальный. А если глобальный - то во всем сеансе акада.
Ну я же правильно понимаю, что при таком объявлении функции
Код:
[Выделить все]
 (defun myfunc (/ a d) ... )
переменные a и d - локальные? Если там будет объявлена переменная type - то после выполнения функции глобальное значение символа type остается без изменений?
Сет вне форума  
 
Непрочитано 23.01.2020, 10:57
#49
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Цитата:
Сообщение от Сет Посмотреть сообщение
переменные a и d - локальные? Если там будет объявлена переменная type - то после выполнения функции глобальное значение символа type остается без изменений?
Именно так.
Только прислушайтесь к совету Сергей812, не используйте без необходимости зарезервированные символы, они обычно синим, знаете ли, подсвечиваются
И прочтение Полещук "AutoLISP и Visual Lisp в среде AutoCAD" 1.1-1.2 и 1.13 вам необходимо.

----- добавлено через ~25 мин. -----
Цитата:
Сообщение от Сет Посмотреть сообщение
Как бы мне по простому отлавливать всяческие ошибки в этом коде и автоматически закрывать файл spec.txt в случае их возникновения
По простому - это читать весть spec.txt в список, закрывать его и потом уже работать со списком, ну и хоть какая-то синхронизация записи в spec.txt и чтение из него (только specbfication.exe должна после освобождения дескриптора spec.txt создавать, пусть и пустой the-end.txt):
Код:
[Выделить все]
 ((lambda (dsk / str)
   (while (setq str (read-line dsk)) (setq result (append result (list str))))
   (close dsk))
  (progn (startapp "c:\\Работа\\Программирование\\Спецификации\\Win32\\Debug\\Specification.exe")
         (while (not (or (vl-file-delete "D:\\MyAutoCAD\\the-end.txt")
                         (initget "Да Нет")
                         (eq "Нет" (getkword "\nЖдать закрытия файла spec.txt [Да /Нет]: <Да> "))))
           (repeat 1000000))
         (open "D:\\MyAutoCAD\\spec.txt" "r")))
__________________
На работе было скучно:shout:

Последний раз редактировалось ciril, 23.01.2020 в 11:50.
ciril вне форума  
 
Автор темы   Непрочитано 23.01.2020, 11:45
#50
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Кстати после добавления локальной переменной type в объявление функции cs_add_specification ошибок с подсчетом суммы функцией cs_calculate_weight больше не возникает. Похоже именно в этом была загвоздка.
Сет вне форума  
 
Непрочитано 23.01.2020, 12:14
#51
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Цитата:
Сообщение от Сет Посмотреть сообщение
Похоже именно в этом была загвоздка.
Если бы у тебя type в каком-нибудь лиспе использовалось, а проверка сейчас была не (= type 'pickset), то искать ошибку можно было бы о-очень до-олго
__________________
На работе было скучно:shout:
ciril вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как создать набор из блоков двух типов? Помогите откорректировать программу.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Требуется написать программу для автоматической расстановки блоков по полилинии. Mozgolom Поиск исполнителей 0 30.12.2019 15:50
Как создать одно 3д тело из двух цветов (или материалов)? Loksana AutoCAD 5 26.01.2018 14:30
народ помогите создать линию проектируемой телефонной канализации ОлегD AutoCAD 13 23.08.2011 19:30
Подсчет и сортировка блоков на текущем слое. Помогите отредактировать. Kortes Программирование 17 26.03.2010 18:46
Как создать сопряжение двух швеллеров по косому срезу BM60 AutoCAD 3 24.04.2009 14:56