Тема: Как "по тихому" загрузить стиль мультилинии, без диалога?
Как можно загрузить стиль мультилинии без использования диалогового окна?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как можно загрузить стиль мультилинии без использования диалогового окна?
Писалось давно, но вроде работало
(defun load_mlinestyle (flnm stname reload / *error* lst_member answer fl fl2 ckl strmus strmus2 lst_style) ;flnm - имя файла стиля мультилинии ;stname - имя стиля мультилинии ;reload - если не nil, то перезагрузка стиля (defun *error* (msg) (vl-catch-all-apply 'close (list fl2)) (princ (strcat "\nОшибка в файле стиля мультилинии " flnm)) );defun (if (or (not (setq lst_member (member (cons 3 stname) (setq answer (dictsearch (namedobjdict) "ACAD_MLINESTYLE"))))) reload );or (if (and (setq fl (findfile flnm)) (setq fl2 (open fl "r")) );and (progn (read-line fl2) (setq ckl t) (while (and ckl (setq strmus (read-line fl2)) (setq strmus2 (read-line fl2)) );and (if (and (= (vl-string-trim " " strmus) "2") (= (vl-string-trim " " strmus2) stname) );and (setq ckl nil) );if );while (while (and (setq strmus (read-line fl2)) (setq strmus2 (read-line fl2)) (/= (setq strmus (vl-string-trim " " strmus)) "0") );and (setq lst_style (cons (cond ((or (= strmus "3") (= strmus "6")) (cons (atoi strmus) (vl-string-trim " " strmus2)) ) ((or (= strmus "51") (= strmus "52")) (cons (atoi strmus) (* (atof (vl-string-trim " " strmus2)) (/ pi 180.0))) ) (t (read (strcat "(" strmus " . " (vl-string-trim " " strmus2) ")")) ) );cond lst_style)) );while (close fl2) (if lst_style (progn (setq lst_style (append (list '(0 . "MLINESTYLE") (cons 330 (cdr (assoc -1 answer))) '(100 . "AcDbMlineStyle") (cons 2 stname)) (reverse lst_style))) (if lst_member (entmod (subst (cons 350 (entmakex lst_style)) (cadr lst_member) answer)) (entmod (append answer (list (cons 3 stname) (cons 350 (entmakex lst_style))))) );if );progn );if );progn );if answer );if );defun
Если параметры стиля заранее известны, то лучше не связываться с файлом, а создать свой с нуля.
Да leha... Так сразу... Придеться с этим разобраться. В общем то, я уже тоже подумал что надо работать со словарем "ACAD_MLINESTYLE", тем более что типы линий известны. Думалось что есть более "элегантные" способы которых я не знаю по неопытности. Пока, чтобы работало все остальное, вставляю файл содержащий все нужные стили как блок, блок стираю, "пуржу" в базе чертежа, стили остаються. Тоже в общем то способ, не сильно он мне нравиться. Особенно то, что сообщение об уничтожении блока в базе чертежа "не гаситься" (setvar "cmdecho" 0).
> leha
Ну уже набросал. Особенно колоритно смотряться части с DXF кодами для каждого стиля. Пока прогнозируеться 26 стилей, думаю что все это экранов на 7.
Если можно еще один теоретический вопрос. Вот я гружу в своем приложении около 40 различных функций (по предварительному плану, сейчас примерно 15, объем примерно 300 кВ) но будет немного больше. Тупо использую в некоторых наиболее используемых функциях функцию (gs) для "сборки мусора", не злоупотребляю глобальными переменными. А каков вообще придел?
Сейчас в основном разрабатываеться "ядро", т.е. функции сохранения данных в словарях, работа с тем что я вношу в расширенные данные, сохранение профилей созданных пользователем, действия при загрузке (что включает загрузку стилей мультилиний). В общем набор функций с аргументами которые можно использовать в различных местах приложения.
Существует ли проблемма с памятью при работе больших приложений. И что значит "большое приложение".
Прошу прощения за возможно дурацкие вопросы. Я программированием занимаюсь всего около года. По жизненному стилю предпочитаю браться за сложное, оценивать общие возможности, потом разбираться с частностями.
> Fantomas
Еще для AutoCAD-10 мы загружали резидентную библиотеку из 200 функций (плюс потом програмы). Проблемы с памятью были в DOS огромные, но все решалось с помощью компилятора acomp и применения функции vmon, обеспечивающей постраничную работу с памятью.
Сейчас проблем с памятью практически нет - это же Windows. Периодическая сборка мусора (например, в начале программы) не повредит, хотя она и выполняется автоматически.
Могут быть проблемы, когда программа, некорректно написанная, с утечкой памяти, выполняется очень долго. Например, конвертирования тысяч файлов. В этом случае начинает использоваться и расти SWAP-файл, что тормозит работу.
"Большое" приложение характеризуется не величиной отдельных модулей, а их количеством и организацией взаимодействия между множеством больших или маленьких программ. Впрочем, это скорее вопрос терминологии.
> ShaggyDoc
Спасибо. Ответ меня удовлетворил.
> Fantomas
В общем-то сложно что-то добавить к сообщению > ShaggyDoc (2004-03-09 06:54:06). У меня опыта горазда меньше, но есть приложение, в нем много сделано неправильно, в том числе и это, но в каждый открываемый файл загружается 680 функций из 12 *.fas файлов общим объемом 1,24 MB. Используется каждый день на нескольких машинах. Минимальный объем памяти - 256 Mb. И сбоев по поводу нехватки памяти не наблюдается.
Хотя это, конечно, неправильно. В каждый файл надо грузить только некий набор библиотечных функций, которые могут использоватся из любой другой функции. А все остальное подгружать по мере надобности.
> leha
Да, наверное как вы заметили я стараюсь писать максимальное количество "универсализированных" функций которые потом вызываю и присваиваю им нужные аргументы. Такого объема как вы пишите, это мое приложение не достигнет. Я просто нигде не мог получить внятного ответа, сколько же можно "туда" загружать. Внесение в словарь всех нужных мультилиний обошлось всего в 37kB в некомпилированном виде.
Большое спасибо за функцию, если я сейчас могу создать словарь мультилиний из DXF, это совсем не значит, что в последствии мне не придеться грузить их из файла (как и стили линий).
Еще о влиянии на память:
В нашей автоматически загружаемой библиотеке 943 функции. Откомпилированный FAS 285 Кб. Эта библиотека загружается в каждый документ практически мгновенно. Конечные программы-функции (их очень много) обычно маленькие, так как используют библиотеку. Иногда, для редко применяемых нужд подгружаются дополнительные библиотеки и выгружаются при завершении программы.
Все "программы" имеют одинаковое имя главной функции - START и одно имя "команды" C:RU. Все программы не сидят в памяти, а загружаются при вызове из меню. В результате память расходуется очень экономно.
А вот пример реальной проблемы с памятью. Пришлось сразу программно рисовать ВСЕ имеющиеся образцы штриховок. Они разношерствные и сделаны в разных масштабах. Соответственно часто вылетает ошибка "Spacing too dense or hatch pattern too small". Предотвратить ее можно изменением
(getenv "MaxHatch") - по умолчанию 10000 на
(setenv "MaxHatch" "100000"). Штриховки начинают рисоваться нормально, но AutoCAD требует очень много памяти и начинает тормозить весь компьютер. Это при 1Гб ОЗУ.
Думаю, что у меня проблемм быть не должно, до 943 фунций ой как далеко. Загрузкой управляю из *.MNL файла, сначала гружу и запускаю функции из "стартового" ЛИСП файла, для различных проверок и подготовки работы остального. "Тяжелых" алгоритмов вроде тоже пока нет, а над загрузкой некоторых функций только в "нужное" время подумаю.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форум работает на PunBB, при поддержке Informer Technologies, Inc