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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Опасные приемы программирования в AutoCAD

Опасные приемы программирования в AutoCAD

Ответ
Поиск в этой теме
Непрочитано 17.12.2008, 11:38 #1
Опасные приемы программирования в AutoCAD
Holon
 
CNC
 
Israel
Регистрация: 07.07.2007
Сообщений: 302

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

Код:
[Выделить все]
(defun path (/ path Pathname$)
  (if (findfile "glass.lsp")
    (progn
  (setq path (substr (findfile "glass.lsp") 1 (-(strlen(findfile "glass.lsp"))9)))
    );end-of progn
    
    
;;;  (alert "Path to glass.lsp not found in Support file Seafch Path")
    (progn
    (setq Pathname$ (getfiled "Support file Seafch Path"  "" "lsp" 20))
    (setq path (substr Pathname$ 1 (-(strlen Pathname$)9)))
    (vla-put-SupportPath  (vla-get-files (vla-get-Preferences (vlax-get-acad-object))) path)
    );end-of progn
    );end-of if
  path
  )
Просмотров: 3868
 
Непрочитано 17.12.2008, 11:43
#2
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,917
<phrase 1=


Offtop:
Один чудак в гостинице спрашивает номер, ему отвечают: "Нет, мол, номеров". А он очень упрашивает - ну хоть каморку какую-нибудь.
Ему и говорят:
- Ну ладно, есть один люкс, но у него слава дурная, там уже восемь человек повесилось.
Чудак в ответ:
- Я не суеверный. Отводят его в номер, показывают ему все, а он спрашивает:
- А как, мол, повесились-то?
- Все вот на этой дверной ручке.
- Не может быть!
- Да вот, уж, смогли.
Утром уборщица открывает дверь - мужик висит на ручке двери, мертвый.
- Елки зеленые, еще один любопытный.
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 17.12.2008, 13:41
#3
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Ну и зачем это? В #1 не функция, которой можно снести AutoCAD (например, из-за каких-то его внутренних ошибок, которые можно не знать). Приведенная функция делает именно то, что автор написал - заменяет список путей на один. Может не подумавши написал. Это просто элементарная ошибка, а может так и специально задумано.

Зачем создавать копилку мусора? Ошибочного кода наберется раз в 10 больше, чем правильного. Кроме того, непременно найдутся люди, которые будут эти ошибки тиражировать.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 17.12.2008, 16:10
#4
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Да это была моя ошибка, нужно было делать примерно так,
не тестировал, протестирую на домашней машине:
Код:
[Выделить все]
(defun test! (/ path Pathname$ sup_list dobavka new_sup_list new_value)
  (if (findfile "glass.lsp")
    (progn
  (setq path (substr (findfile "glass.lsp") 1 (-(strlen(findfile "glass.lsp"))9)))
    );end-of progn
    (progn
(setq
sup_list(vla-get-SupportPath  (vla-get-files (vla-get-Preferences (vlax-get-acad-object))))
Pathname$ (getfiled "Support file Seafch Path"  "" "lsp" 20)
path (substr Pathname$ 1 (-(strlen Pathname$)9))
dobavka (strcat";"path)
new_sup_list (append(vl-string->list sup_list)(vl-string->list dobavka))
new_value(vl-list->string new_sup_list) 
)
(vla-put-SupportPath  (vla-get-files (vla-get-Preferences (vlax-get-acad-object))) new_value)
    );end-of progn
    );end-of if
  (test!)
  )
а по поводу нужности незнаю, неужели на все грабли нужно наступать самому :-)
Holon вне форума  
 
Непрочитано 18.12.2008, 00:33
#5
Кулик Алексей aka kpblc
Moderator

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


Есть одна замечательная функция - purge называется. Теоретически ее можно заменить на vla-delete, применяемого к элементам соответствующих коллекций и словарей. Так вот: очищать таким образом словарь стилей таблиц нельзя - надо оставлять как минимум 1 "в живых". В противном случае: если в файле не было ни одной таблицы, и тут же пытаться ее создать вручную, вылет практически гарантирован. Сохранение файла происходит нормально, но открыть его невозможно.
Проверял на AutoCAD 2005 Eng, ADT 2005 Eng, AutoCAD 2006 Eng, AutoCAD 2006 Rus, ADT 2006 Eng, ADT 2006 Rus. На более поздних версиях экспериментов не ставил.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.12.2008, 05:07
#6
Mek

Изобретение металлических гаражей
 
Регистрация: 10.09.2004
Сибирь
Сообщений: 559


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Есть одна замечательная функция - purge называется. Теоретически ее можно заменить на vla-delete, применяемого к элементам соответствующих коллекций и словарей. Так вот: очищать таким образом словарь стилей таблиц нельзя
Этими двумя способами нельзя делать?
Таблицы не использую совсем (а может и использую, но не знаю что это такое).
Недавно научился делать Файл/Утилиты/Очистить/Удалить все
Размер файла уменьшился с 4 мегабайт до 100 килобайт.
Отправил на согласование - там проблем с открытием не было.
Сейчас попробовал создать новый файл, нарисовал кружочек, в листе настроил видовой экран, сохранил, закрыл.
Потом открыл, почистил способом Удалить все. Сохранил.... Закрыл... Открыл... Нормально всё..
__________________
В этом и состоит диалектика жизни
Mek вне форума  
 
Непрочитано 18.12.2008, 08:34
#7
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Цитата:
Недавно научился делать Файл/Утилиты/Очистить/Удалить все
Ну, молодец.
Profan вне форума  
 
Непрочитано 18.12.2008, 09:43
#8
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Вот Алексей правильно про опасность удаления стилей таблиц написал. В 2008 этот баг сохранился. И с программированием это напрямую связано. Создавая таблицу программно надо предварительно проверить наличие стиля (причем с ловушкой ошибки), создать его, если отсутствует. И делать это надо каждый раз, не полагаясь на то, что стиль был создан "недавно". Пользователь мог его удалить.

Это действительно ошибка Автокада. В принципе любые стили - это всего лишь совокупность некоторых настроек, чтобы пользователю при ручной работе облегчить жизнь. Объекты вообще-то можно создавать программно, назначать нужные свойства и вообще не думать о стиле. А вот таблицы попадают в исключения - нужно думать о наличии стиля.

Правильным решением со стороны Аутодеск была бы невозможность ручного удаления единственного стиля (как нельзя слой 0 удалить). Может быть сообразят...
ShaggyDoc вне форума  
 
Непрочитано 18.12.2008, 13:30
#9
Кулик Алексей aka kpblc
Moderator

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


ShaggyDoc, вряд ли. На примере ADT (он же АА) - версии от 2005 до 2008 включительно. Там есть такая штука, как стили (стен, проемов, окон и проч.лабуды). Так вот, при ручном удалении ядро AA проверяет - а не использовался ли этот стиль (в том числе - стили с именем Standard не удаляются никак). При попытке программного удаления такого стиля (ну да, хранится он в отдельном словаре) все как бы проходил "ок", только вот ни повторно стили не импортировать, ни согласовать их - не получается.
Отсюда для себя я вывел такую мораль: в вертикальных решениях оставить возможность копаться "в потрохах" либо юзеру, либо самому ядру. И без особо крайней нужды туда не лезьть (только если прочитать что-либо).
---
Добавлено:
Mek, а что ты будешь делать, если удалять надо без применения командных методов? Ну вот такое хитрое условие.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.12.2008, 14:09
#10
Mek

Изобретение металлических гаражей
 
Регистрация: 10.09.2004
Сибирь
Сообщений: 559


Цитата:
Этими двумя способами нельзя делать?

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
а что ты будешь делать, если удалять надо без применения командных методов?
Ну что за манера, ёлки-палки, игнорировать вопрос и задавать тут же другой...

Не могу представить ситуацию когда лично мне надо будет действовать в каких-то хитрых условиях.
Если речь идет о всяких ваших программных зачистках - в теме не участвую, в дебри лиспов не лезу... Пас.
__________________
В этом и состоит диалектика жизни
Mek вне форума  
 
Непрочитано 18.12.2008, 14:23
#11
Кулик Алексей aka kpblc
Moderator

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


Mek, а у меня такая ситуация в полный рост стояла: выполнять очистку файла от "мусора" при сохранении этого файла. Выход был только один - использовать командный реактор. А там применять command нельзя.
То, что ты с ней еще не сталкивался - еще ничего не значит. Рано или поздно столкнешься, если начнешь заниматься программированием под AutoCAD.
---
Добавлено: под "мусором" понимается не только то, что выдает _.pugre...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.12.2008, 14:36
#12
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Если речь идет о всяких ваших программных зачистках - в теме не участвую, в дебри лиспов не лезу... Пас
Ветка - Программирование, Тема - Опасные приемы программирования.
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Опасные приемы программирования в AutoCAD



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ObjectARX. Расчленение и удаление proxy-объектов Profan Готовые программы 293 08.04.2024 09:37
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
О создании темы (раздела) для новичков в AutoCAD. Profan Разное 110 23.10.2008 10:01
AUTOCAD 2006 Aragorn AutoCAD 14 01.04.2005 00:55
Что нового в AutoCAD 2005 ilka_t AutoCAD 40 19.05.2004 16:48