Где я должен разместить команды в проекте Autocad VB.NET?

Я очень новичок в программировании Autocad, новичок несколько месяцев, но мне удалось написать приложение с примерно 10 командами Autocad. Большинство этих команд показывают окно, и все остальное делается из этого окна. Я пытаюсь сделать свое приложение MVVM..ish. Поскольку у меня почти 1 к 1 соответствие между представлениями Models ViewModels и командами, я счел целесообразным поместить команду в одну из 3 частей MVVM. Сначала я решил поместить команду в ViewModel, потом понял, что моя команда показывает только окно, а ViewModel не должна обрабатывать окна, поэтому я перенес команду в Codebehind View. Как я понял, нормально иметь код в отделенном коде, если он строго связан с представлением. Затем я прочитал об атрибуте CommandClass в каком-то учебнике, предоставленном Autodesk, и нашел это:

CommandClassAttribute Этот настраиваемый класс атрибутов используется для обозначения типа как командного класса приложения. Приложение может назначить один и только один тип в качестве своего командного класса. AutoCAD ищет методы команд приложения для типа, имеющего этот атрибут.

Это говорит о том, что у меня должен быть один класс для включения всех моих команд. Затем я прочитал это, что подтверждает вышесказанное:

Для командного метода экземпляра включающий тип метода создается отдельно для каждого открытого документа.

Таким образом, мой первый подход к размещению команд в представлениях или моделях представления был совершенно неправильным, потому что у меня были бы экземпляры модели представления, не делающие ничего, кроме выполнения команды. Затем я прочитал это в документации ObjectARX:

Если приложение использует атрибут CommandClass, оно должно объявить экземпляр этого атрибута для каждого типа, содержащего метод обработчика команд AutoCAD.

Что прямо противоречит приведенному выше учебнику, а также предполагает, что это утвержденная практика - иметь более одного класса для обработки команд.

Все учебные пособия по Autocad .NET представляют собой проекты с одним классом и одной командой, поэтому у вас не будет большого выбора, куда что поместить.

Может ли какой-нибудь опытный разработчик Autocad .NET предложить передовую или, по крайней мере, хорошую или неправильную практику управления командами Autocad в довольно большом проекте?


person Andrei    schedule 08.07.2013    source источник
comment
[Попробуйте просмотреть ссылку ниже, она может вам помочь][1] [1]: stackoverflow.com/questions/1338955/autocad-in-vb-net?rq=1   -  person VB.NET LEARNER    schedule 08.07.2013
comment
Спасибо за ваш ответ, но у меня нет проблем с запуском. Я уже посещал большинство этих ссылок несколько месяцев назад, когда только начинал работать с Autocad .NET. К сожалению, большинство из них охватывают основную проблему hello world.   -  person Andrei    schedule 08.07.2013


Ответы (1)


В моей работе этот атрибут CommandClass привязан к одному классу, предоставленному мастером, который я использовал для запуска.

Внутри этого класса команд я помещаю команды, ВСЕ. Каждый с атрибутом CommandMethod.

Таким образом, они не привязаны ни к какому объекту или представлению (и я действительно думал, что это возможно только с использованием VBA, а не .NET).

Но их код там не написан, я создаю разные классы для управления командами, поэтому основной класс команд работает в основном как индекс команд, каждая команда вызывает соответствующее тело в разных классах, которые я создал для своих целей.

Итак, на вашем месте я бы, наверное, сделал атрибут MyCommands с атрибутом CommandClass со всеми командами. Каждая команда просто вызывает тело команды из класса ViewCommands ниже.

Создайте класс ViewCommands (и многие другие, которые вам нужны, чтобы упростить вашу модель). Этот класс doesn't имеет атрибут CommandClass, просто имеет обычные методы. В нем будет ядро ​​команд, которые будут вызываться из CommandClass методов.

Я никогда не пытался работать более чем с одним CommandClass, и я считаю, что лучше сосредоточить все команды в одном месте, чтобы хорошо отслеживать, что делает ваша надстройка.

person Daniel Möller    schedule 08.07.2013
comment
Спасибо за ваш вклад и за то, что поделились своим опытом, но я хотел бы оставить вопрос без ответа еще на несколько дней, чтобы, возможно, гуру Autocad.NET увидели его и дали более аргументированный ответ. - person Andrei; 09.07.2013
comment
Как я недавно узнал, справка просто неверна, когда говорит, что это может быть только один атрибут командного класса, поэтому Autodesk не планировал иметь только один командный класс. - person Andrei; 09.07.2013
comment
Итак, решать вам. Вероятно, лучшие практики будут исходить из общих практик разработки, поскольку я ничего не видел конкретно о Autocad .NET. Возможно, вам даже не нужен атрибут CommandClass, моя помощь в мастере надстроек говорит, что это не обязательно, но повышает производительность. - person Daniel Möller; 09.07.2013