Не получается добивать библиотеку

Автор kolomboss, 18.05.13, 23:26:06

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

kolomboss

 Всем привет :-) Есть пара нубских вопросов от начинающего нуба)
1. Пробую добавить библиотеки (.rtw), но ничего не получается. Язык разработки С#, среда Вижуа Студио 2010 Экспресс. Компилирую Step1, пытаюсь добавить её в Компасе и вылетает ошибка "Некорректная структура библиотеки. "Библиотека не подключается". Версия Компаса 10 СП2. Качал готовые библиотеки - какие то добавляются, какие то нет. От чего зависит? Где-то пишут что "для компаса 8+" и тд, но не очень понятно как писать конкретно для какого-то компаса вообще, если по идее то везде должно работать. Как я понял там только разные версии АПИ - пятая и седьмая. В справке пишут про какойто tlbimpl и RegAsm - но зачем всё это надо и как это всё применить я не понял. Также говорится что для регистрации библиотеки нужен статический метод MethodSample (Type type). Но что за метод, где взять и тд - не написано. Справка написано по принципу "ну всё итак понятно же чуваки". Внешний контроллер сделать получается - компас запускается там и всё такое. Но чтото мне подсказывает что нужна именно подключаемая библиотека. Кстати, между подключаемой библиотекой, и внешним приложением есть какая нибудь разница в плане функционала и тд? Какая разница то вообще?
Искал информацию но толком ничего не нашёл. Всё разбросано мелкими частицами по форумам и тд. Буду признателен за любую информацию :-)

PS

ЦитироватьКачал готовые библиотеки - какие то добавляются, какие то нет. От чего зависит? Где-то пишут что "для компаса 8+" и тд, но не очень понятно как писать конкретно для какого-то компаса вообще, если по идее то везде должно работать.
Начиная с Компас 10 в Компас реализована поддержка Юникода, поэтому библиотеки созданные для более ранних версий могут и не работать. А так как API изменяется от версии к версии, то библиотеки созданные в текущей версии Компаса могут не работать в более ранних.
Цитироватьпытаюсь добавить её в Компасе и вылетает ошибка "Некорректная структура библиотеки. "Библиотека не подключается". Версия Компаса 10 СП2.
Скорее всего проблемы с Юникодом.
ЦитироватьКак я понял там только разные версии АПИ - пятая и седьмая. В справке пишут про какойто tlbimpl и RegAsm - но зачем всё это надо и как это всё применить я не понял. Также говорится что для регистрации библиотеки нужен статический метод MethodSample (Type type). Но что за метод, где взять и тд - не написано
Смотрите MSDN, например http://msdn.microsoft.com/ru-ru/library/tt0cf3sx.aspx
ЦитироватьСправка написано по принципу "ну всё итак понятно же чуваки".
Справка написана вполне сносно, нужно иметь представления как создавать dll и знать технологию Automation или COM интерфейсов.
ЦитироватьКстати, между подключаемой библиотекой, и внешним приложением есть какая нибудь разница в плане функционала и тд? Какая разница то вообще?
Подключаемые библиотеки вызываются из Компаса, а внешнее приложение вызывает Компас.

kolomboss

ЦитироватьСкорее всего проблемы с Юникодом.
И как же решить эту проблему? Там ведь обычный код, точно такой же как и везде, дак какие могут быть проблемы с юникодом в step1 - я не понимаю...
ЦитироватьСправка написана вполне сносно, нужно иметь представления как создавать dll и знать технологию Automation или COM интерфейсов.
Справка построенна непонятно по какому принципу. Поиск по справке ужасен, в поиске не указывается в каком разделе находится описание этой функции (дерево не выстраивается), в большинстве случаев очень трудно отследить что отчего наследует и чему принадлежит вообще, нету разделения на "вот так эта функция записывается в апи5, а так в апи7". Причем чтобы найти "аналог" в апи7 приходится юзать интернет - но и там порой не находится информации и сидишь и хоть вручную перебирай раздел "апи7". Код показывается, есстественно без подсветки и сплошным текстом без отступов. Как пользоваться такой "справкой" я не представляю. Я видимо уже слишком "искушён" такой вещью как джавадок...
ЦитироватьСмотрите MSDN, например http://msdn.microsoft.com/ru-ru/library/tt0cf3sx.aspx
Тоесть, я так понимаю, чтобы эта dll заработала, нужно её "пропатчить" утилитой regasm, потом утилитой tlbimpl, потом ещё реализовать(как?) там какойто статический метод "MethodSample (Type type)" и это ещё не говоря о том, что в коде самой библиотеки есть ещё как минимум два метода, которые тоже там вроде как выполняют какуюто "регистрацию" библиотеки... Прибавить ещё какието непонятные проблемы с юникодом и сразу на всё это напрашивается слово "гемор"...
ЦитироватьПодключаемые библиотеки вызываются из Компаса, а внешнее приложение вызывает Компас.
Но тогда, как я понимаю, внешнее приложение не сможет быть, например, панелью в компасе... тоесть оно всегда будет внешним окном и его нельзя будет запустить как диалог/панель/меню и тд, которое предлагается когда подключаешь библиотеку из компаса... так я понимаю?

PS

1. На C# не программирую, поэтому не могу сказать почему не работает и как нужно настроить опции проекта  для компиляции.
2. Дерево справки у меня разворачивается на выбранной функции в Указателе справки.
3. С внешним приложением не работал, но в справке написано:
Цитировать
ActiveX компонент.
KGAX - ActiveX компонент предназначен для использования во внешнем приложении и позволяет открывать и работать с документами системы КОМПАС в диалоге пользователя. При работе с документами, открытыми в ActiveX компоненте, доступно использование API интерфейсов системы КОМПАС. Кроме этого, для работы с KGAX разработаны интерфейсы этого элемента управления.

q

Подробную инструкцию написать не могу потому как давно не писал проги под КОМПАС и нету Визуал Студии под рукой. Но думаю проще всего начать делать отдельным приложением (проект \SDK\C#\Automation\ksContr). Подключи нужные dll из папки SDK\C#\Common, а дальше делай по инструкции.
При создании отдельным приложением можно скрыть окно КОМПАСа, и все команды будут выполняться без отображения на экране, как по мне это ускоряет процесс выполнения программы особенно при работе с большим количеством файлов.

kolomboss

Аха, я уже изначально начал именно отдельным приложением и ksContr смотрел, изучал.
Вот столкнулся с другой проблемой. Ну, столкнулся с незнанием просто. Вот я ищу нужный мне элемент на чертеже перебором. Допустим, текстовый лейбл. Вот мне итератор возвращает какойто reference
doc.ksExistObj(obj = iter.ksMoveIterator("F"))
Я беру потом этот obj и проверяю не лейбл ли он кодом:
doc.ksGetObjParam(obj, 0, 0) == ldefin2d.TEXT_OBJ
И вот он мне выдаёт что да, это лейбл... но как тебе привести то этот obj к типу Лейбла(Text), как посмотреть его свойства там, длинну его узнать, узнать что за строка в нём содержится, шрифт которым он написан и тд? Какими функциями это делается?
В типичном программировании это выглядело бы примерно так:
TextLabel label = (TextLabel)obj;
obj.getText(); //получить текст
obj.getFont(); //получить обьект шрифта и тд...

А тут то как это делается, как работать с типами, с обьектами?
Я нашёл какуюто странную функцию
kompas.GetParamStruct(int вроде)
Она возвращает нужный интерфейс по переданному аргументу. Но как мне привести то уже СУЩЕСТВУЮЩИЙ объект к нужному мне интерфейсу и работать с ним?
Может хотябы скажите какой Step посмотреть, или где в справке почитать...? Вчера час лазал в справке - так и не понял как это делается...

Slaviation

ЦитироватьИ вот он мне выдаёт что да, это лейбл... но как тебе привести то этот obj к типу Лейбла(Text), как посмотреть его свойства там, длинну его узнать, узнать что за строка в нём содержится, шрифт которым он написан и тд? Какими функциями это делается?

Как-то так (delphi):
...
var
  params: ksTextParam;
...
begin
...
  param := kompas.GetParamStruct(ksConstTLB.ko_TextParam);
  if doc.ksGetObjParam(obj, 0, 0) = ldefin2d.TEXT_OBJ then
  begin
    params.Init;
    doc.ksGetObjParam(obj, params, LDefin2D.ALLPARAM);
     ...
     //Далее раскручивать params.GetTextLineArr
  end
 

q

#7
Возможно в качестве примера подойдет функция private void DrawText() из Step3. А вобще можно воспользоваться API 7, интерфейс IText.

.

kolomboss

Спасибо парни. Но не получается... посмотрел пример DrawText, но так и не смог переделать под свои нужды. Не могу прочесть строку. Вроде как "читается", но она пустая всегда... как посмотрел на эти циклы, "парамы" эти, динамические массивы и тд - ужаснулся... простой obj.getText() просто курит в сторонке по сравнению с такими выкрутасами.