Тема: Как "по тихому" загрузить стиль мультилинии, без диалога?

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

Re: Как "по тихому" загрузить стиль мультилинии, без диалога?

Писалось давно, но вроде работало

(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

Если параметры стиля заранее известны, то лучше не связываться с файлом, а создать свой с нуля.

Re: Как "по тихому" загрузить стиль мультилинии, без диалога?

Да leha... Так сразу... Придеться с этим разобраться. В общем то, я уже тоже подумал что надо работать со словарем "ACAD_MLINESTYLE", тем более что типы линий известны. Думалось что есть более "элегантные" способы которых я не знаю по неопытности. Пока, чтобы работало все остальное, вставляю файл содержащий все нужные стили как блок, блок стираю, "пуржу" в базе чертежа, стили остаються. Тоже в общем то способ, не сильно он мне нравиться. Особенно то, что сообщение об уничтожении блока в базе чертежа "не гаситься" (setvar "cmdecho" 0).

Re: Как "по тихому" загрузить стиль мультилинии, без диалога?

> leha
Ну уже набросал. Особенно колоритно смотряться части с DXF кодами для каждого стиля. Пока прогнозируеться 26 стилей, думаю что все это экранов на 7.
Если можно еще один теоретический вопрос. Вот я гружу в своем приложении около 40 различных функций (по предварительному плану, сейчас примерно 15, объем примерно 300 кВ) но будет немного больше. Тупо использую в некоторых наиболее используемых функциях функцию (gs) для "сборки мусора", не злоупотребляю глобальными переменными. А каков вообще придел?
Сейчас в основном разрабатываеться "ядро", т.е. функции сохранения данных в словарях, работа с тем что я вношу в расширенные данные, сохранение профилей созданных пользователем, действия при загрузке (что включает загрузку стилей мультилиний). В общем набор функций с аргументами которые можно использовать в различных местах приложения.
Существует ли проблемма с памятью при работе больших приложений. И что значит "большое приложение".
Прошу прощения за возможно дурацкие вопросы. Я программированием занимаюсь всего около года. По жизненному стилю предпочитаю браться за сложное, оценивать общие возможности, потом разбираться с частностями.

Re: Как "по тихому" загрузить стиль мультилинии, без диалога?

> Fantomas
Еще для AutoCAD-10 мы загружали резидентную библиотеку из 200 функций (плюс потом програмы). Проблемы с памятью были в DOS огромные, но все решалось с помощью компилятора acomp и применения функции vmon, обеспечивающей постраничную работу с памятью.
Сейчас проблем с памятью практически нет - это же Windows. Периодическая сборка мусора (например, в начале программы) не повредит, хотя она и выполняется автоматически.
Могут быть проблемы, когда программа, некорректно написанная, с утечкой памяти, выполняется очень долго. Например, конвертирования тысяч файлов. В этом случае начинает использоваться и расти SWAP-файл, что тормозит работу.
"Большое" приложение характеризуется не величиной отдельных модулей, а их количеством и организацией взаимодействия между множеством больших или маленьких программ. Впрочем, это скорее вопрос терминологии.

Re: Как "по тихому" загрузить стиль мультилинии, без диалога?

> ShaggyDoc
Спасибо. Ответ меня удовлетворил.

Re: Как "по тихому" загрузить стиль мультилинии, без диалога?

> Fantomas
В общем-то сложно что-то добавить к сообщению > ShaggyDoc (2004-03-09 06:54:06). У меня опыта горазда меньше, но есть приложение, в нем много сделано неправильно, в том числе и это, но в каждый открываемый файл загружается 680 функций из 12 *.fas файлов общим объемом 1,24 MB. Используется каждый день на нескольких машинах. Минимальный объем памяти - 256 Mb. И сбоев по поводу нехватки памяти не наблюдается.
Хотя это, конечно, неправильно. В каждый файл надо грузить только некий набор библиотечных функций, которые могут использоватся из любой другой функции. А все остальное подгружать по мере надобности.

Re: Как "по тихому" загрузить стиль мультилинии, без диалога?

> leha
Да, наверное как вы заметили я стараюсь писать максимальное количество "универсализированных" функций которые потом вызываю и присваиваю им нужные аргументы. Такого объема как вы пишите, это мое приложение не достигнет. Я просто нигде не мог получить внятного ответа, сколько же можно "туда" загружать. Внесение в словарь всех нужных мультилиний обошлось всего в 37kB в некомпилированном виде.
Большое спасибо за функцию, если я сейчас могу создать словарь мультилиний из DXF, это совсем не значит, что в последствии мне не придеться грузить их из файла (как и стили линий).

Re: Как "по тихому" загрузить стиль мультилинии, без диалога?

Еще о влиянии на память:
В нашей автоматически загружаемой библиотеке 943 функции. Откомпилированный FAS 285 Кб. Эта библиотека загружается в каждый документ практически мгновенно. Конечные программы-функции (их очень много) обычно маленькие, так как используют библиотеку. Иногда, для редко применяемых нужд подгружаются дополнительные библиотеки и выгружаются при завершении программы.
Все "программы" имеют одинаковое имя главной функции - START и одно имя "команды" C:RU. Все программы не сидят в памяти, а загружаются при вызове из меню. В результате память расходуется очень экономно.
А вот пример реальной проблемы с памятью. Пришлось сразу программно рисовать ВСЕ имеющиеся образцы штриховок. Они разношерствные и сделаны в разных масштабах. Соответственно часто вылетает ошибка "Spacing too dense or hatch pattern too small". Предотвратить ее можно изменением
(getenv "MaxHatch") - по умолчанию 10000 на
(setenv "MaxHatch" "100000"). Штриховки начинают рисоваться нормально, но AutoCAD требует очень много памяти и начинает тормозить весь компьютер. Это при 1Гб ОЗУ.

Re: Как "по тихому" загрузить стиль мультилинии, без диалога?

Думаю, что у меня проблемм быть не должно, до 943 фунций ой как далеко. Загрузкой управляю из *.MNL файла, сначала гружу и запускаю функции из "стартового" ЛИСП файла, для различных проверок и подготовки работы остального. "Тяжелых" алгоритмов вроде тоже пока нет, а над загрузкой некоторых функций только в "нужное" время подумаю.