Доступ к Embedded листу Excel как к базе данных из Autocad (c#).

Автор Тема: Доступ к Embedded листу Excel как к базе данных из Autocad (c#).  (Прочитано 9510 раз)

0 Пользователей и 6 Гостей просматривают эту тему.

Оффлайн sergolgaАвтор темы

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Доброго времени суток.
Предыстория: У меня существует необходимость постоянного доступа к embedded листу Excel как к базе данных (чтение, редактирование, добавление строк и листов, синхронизация с данными) при работе в Autocad (лист эксель встроен в редактруемый файл автокад). Экслель, потому что хорошо его знаю (с т.зр. программирования и пользования, что на данном этапе ускорит разработку приложения - я начинающий в c#, NET, а с технологиями баз данных sql - слабо знакома), а также т.к. эта база данных в эксель будет периодически редактироваться конечными пользователями net-плагина вручную. Использую Embedded - т.к. работа осуществляется с использованием DropBox, поэтому возможны создания версий файлов (как акада, так и линкнутого в качестве внешнего источника к нему файла Excel) разными пользователями, что может внести значительную сумятицу в определение верного источника данных для соответствующего файла автокад. Поэтому после взвешиваний всех за и против пришла все же именно к варианту Embedded, а не Link.
Проблема: доступ организовала через Interop.Excel (как здесь: http://help.autodesk.com/view/ACD/2016/ENU/?caas=caas/discussion/t5/-NET/Read-Embedded-Excel-sheet/td-p/3773610.html). Файл эксель обрабатывается в невидимом режиме для пользователя, чего и хотелось, но: 1) embedded файл все же открывается активным либо новым (если активных нет) экземпляром Эксель, хоть и в невидимом для пользователя режиме, а значит, если на момент  открытия в активном эксель-приложении редактируется ячейка, то выскакивает ошибка моего плагина, типа: "Продолжить не могу, эксель занят, сворачиваю дебаг"; а главное 2) почитала на просторах инета мнение, что Интероп - это не лучшее решение, т.к.  медлителен,  частенько ошибки выдает, да и синхронизация с ним как с БД, видимо, будет затруднительной, и что наилучшим решением является OleDbConnection из  System.Data.OleDb. Но при подключении через OleDbConnection нужно указать путь к файлу Эксель,а его нет, т.к. файл Embedded. Отложила лучшее решение, попыталась хотя бы добить Интероп с его редактруемой ячейкой добавлением нового дополнительного экземлпяра Эксель, и опять - тупик: не получается перенаправить открытие Embedded файла, оно упорно идет в первый из созданных на компе экземпляров Экселей.

Можно ли как-то решить проблему указания пути в OleDbConnection? как? а если не возможно, то тогда может есть способ перенаправить открытие файла через Интероп в новый экземпляр Эксель? А?  :'(

Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
На оба вопроса ответ отрицательный. Возможность работы через API с вставленными (Embedded) объектами очень ограничена. Так что сразу советую уйти от этого решения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн sergolgaАвтор темы

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
На оба вопроса ответ отрицательный
Спасибо за ответ. Рыдаю, т.к. не знаю что делать дальше (:. Буду искать замену embedded, хотя пока и не знаю куда бечь. Еще раз спасибо. По крайней мере, оградили меня от бессмысленного топтания на месте в попытке решить нерешаемое.
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Рыдаю, т.к. не знаю что делать дальше (:
Если речь идёт просто о месте хранения информации в самом чертеже, то это Xrecord'ы и NOD (или Extension Dictionary). А если для чего-то другого, то объясни для чего.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн sergolgaАвтор темы

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
А если для чего-то другого, то объясни для чего
Я решаю задачу, о которой писала Вам ранее (может вспомните, Вы еще делали ловлю события Снэп по этой задаче: запись последовательности действий пользователя при создании конструкций одежды, с возможностью их повторения, но уже с другими исходными данными). Так вот эту последовательность я и планировала записывать в соответствующие листы Экселя, вставленные в файл Автокада.

Плюсы: все в одном месте;
при совместной работе через DropBox создаются синхронизированные версии как автокада так и файла данных Эксель от разных пользователей;
последовательность может просмотреть пользователь в ручном режиме, возможно что-то поменять;
в состав листа входят и исходные данные (размерные признаки), которые тоже можно вставлять как вручную, так и программно;
легкая отсылка к нужным объектам чертежа в операции редактирования через ссылки в формулах к этим операциям на ячейки с  метками (Handle) объектов из  операций создания таких объектов (при провторном прохождении последовательности меняются только метки пересоздаваемых объектов, а  операции редактирования объектов не меняются, их изменение происходит автоматически в составе формулы).
также через записи последовательности в эксель, планировала делать возможность создания версий операций и их последованиельностей (своего рода - разные "сборки" одной конструкции, при этом разные варианты, это не полностью новые варианты, а "ветвление" последовательности операций);
обработка строк Экселя давала бы возможность "шагать" по последовательности назад-вперед (удаление и перестраивание конструкции по шагам до определенного шага в той или иной "сборке");
возможность создания в одном файле Эксель нескольких изделий (на разных листах), работающих с одним файлом автокада.
 
Выбор сборки, шагов в ней, неактивных шагов других "сборок" и конктретных составляющих текущего шага (какие объекты, какие операции, какой СНЭП и т.п.), планировалось выводить через DataTable (мультиколумные данные) в комбобоксы и листбоксы windFormы, которую и хотелось синхронизировать с определенными Range определенных листов Эксель (каждый лист - это конструкции отдельного изделия). При переходе между файлами автокада соответственно должно менять содержание немодальной формы (обновляясь по данным втроенного эксель-файла в новом файле автокад).

К сожалению, т.к. Xrecord (пыталась разобраться, но с первого взляда не смогла понять как их использовать для моей задачи) и Nod (первый раз слышу) мне не знакомы, то я их не рассматривала для своей задачи. В Xdata планаровала изспользовать для хранения данных об активном листе, сборке и шаге, а также другие меняющиеся данные для ускорения фильтрования данных из Экселя. Я пробовала рассмотреть для своей задачки таблицы автокада, но они при прочих равных объмах данных по сравнению с  встроенным Эксель-файлом в разы тяжелее и не могут содержать несколько листов. Так же эксель подкупал тем, что я его очень хорошо знаю и как пользователь и как программер (еще по VBA).

Если направите меня в иную сторону от Экселя, то перенапралю свои силы туда. Еще раз спасибо, за помощь.
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если направите меня в иную сторону от Экселя, то перенапралю свои силы туда.
Я даже не знаю с чего начать. В очередной раз Вы ставите меня в тупик каким-то (на мой взгляд) неадекватным отношением к AutoCAD'у.
Excel в этом всём мне видится совершенно чужеродным, бессмысленным...
1. Внутри самого AutoCAD данные можно хранить в XData, но они ограниченны 16Кб на один примитив и скорее всего Вам не подойдут.
2. Можно хранить данные в XRecord, причем структура данных может быть произвольной.
К сожалению, т.к. Xrecord (пыталась разобраться, но с первого взляда не смогла понять как их использовать для моей задачи)
Значит придётся разобраться - примеров достаточно. В том числе и на нашем сайте и форуме.
и Nod (первый раз слышу) мне не знакомы
NOD (Name Object Dictionary): http://adn-cis.org/soxranenie-sobstvennyix-znachenij-na-urovne-dwg-fajla.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн sergolgaАвтор темы

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
неадекватным отношением к AutoCAD'у
Он не неадекватный :), а делитантский (за что прошу прощения). Я ж программист самоучка, и автокадчик самоучка, я даже не инженер, а бывший финансист. Просто жизнь складывается, что приходится расширять свои сферы знаний.

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

Но коли, мои первые впечатления оказались обманчивы, будем изучать глубже, глубже и глубже новое :). Спасибо за совет и терпение.
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Ну изучить как sql, так и способ хранения данных в "автокаде" конечно стоит, но если "требуемый уровень" реализации позволяет Вам использовать в качестве хранения excel, то он на самом деле не лишен смысла (то есть, если структура данных хорошо ложится на "стандартный" эксель, то вы уже сразу выигрываете, что Вам не надо придумывать и воплощать пользовательский интерфейс, а главное обучать ему - excel все-же довольно популярная и многим хотя-бы поверхостно знакомая программа). У меня есть в крупном проекте, привязанные к графическим примитивам данные, но хранятся они во внешней БД, есть и разработанный интерфейс для их редактирования, работает он уже достаточно давно. Но есть и сделанный по просьбе "трудящихся" упрощенный аналог внесения и корректировки этих данных как раз-таки в excel'е - то есть в той-же БД может хранится бинарник excel'я заполненный по определенным правилам - на который ссылается примитив. Да в нем работать по факту получается гораздо медленней, и не все возможности через него реализованы. Но если деталь достаточно простая, то их зачастую достаточно, и что главное - показав пару команд и дав образец аналогично сделанной детали вчера пришедший сотрудник сможет реализовать новую без всякого прочтения документации - достаточно чтоб понял структуру - учить ничему не надо - то есть такой как-бы "школьный" уровень. Как привязать excel к автокаду в Вашем случае - решите сами - для начала - хоть пусть рядом одноименный файл лежит - где все описанно. Interop для программной работы с excel'ем я бы тоже не рекомендовал, для работы с файлами excel'я я, например, использую EPPlus.

Оффлайн sergolgaАвтор темы

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
Interop для программной работы с excel'ем я бы тоже не рекомендовал, для работы с файлами excel'я я, например, использую EPPlus.
Дмитрий, спасибо за участие и совет. Попробую и этот путь поизучать (EPPlus). Я понимаю и понимала изначально, что если подходить серьезно к вопросу, то одним Экселем не обойтись, потому и пыталась изначально понять работу расширенных функции Автокада (словари, записи), но организовать работу через них мне показалось сложным для моего текущего уровня знаний, а если не сложным, то уж точно долгим, в то время как для ускорения разработки плагина (дабы коллеги заждались) эксель давал много преимуществ. Так что пока посажу плагин на эксель (опять же изначально понимая, что по скорости он работать будет скорее всего медленнее, но зато хотя бы начнет работать). А вот уже потом без гнета тяжелых взглядов коллег буду переводить на более серьезные рельсы, воспользовавшись советами Александра и Вашими.
И да, признаюсь :), как и в Вашем случае с "трудящимися", изначально подкупало в Экселее и уже готовый интерфейс и знакомство с ним моих коллег.
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
опять же изначально понимая, что по скорости он работать будет скорее всего медленнее, но зато хотя бы начнет работать
Я не знаю сложность предстоящих Вам задач, но EPPlus - достаточно шустро обрабатывает поддерживаемые формулы, оно-же как и загружает файлы. Единственно что наверное понадобится "доделывать" самому - если задача в этом есть - это оптимизация раскроя материала, эта задача может быть чрезвычайно ресурсоемкая и многоступенчатая  (учет обрезков и пр.).

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Не понимаю зачем использовать Эксель, когда есть такие замечательные вещи, как xml, linq to xml, binding? Все данные можно отлично хранить. Сериализация и десериализация ускоряют процесс сохранения и загрузки данных. В общем - быстро, легко и удобно

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Ну это если Вам надо просто табличку ввести/вывести, то все просто, а если в этой таблице подразумевается ввод зависимостей пользователем - Вы прочитайте исходную задачу автора - ей надо по записи действий пользователя построить параметрическую модель изделия - да XML тоже поддерживает формулы - но во первых их ни 1 юзер не знает, во вторых, попробуйте заставьте юзера писать GUI в рукопашную.
з.ы. Забавно, но опять отсылаясь, к то-му же большому проекту - вначале, когда создавал рабочий прототип, я действительно использовал XML, который заполнял сам "в рукопашную", потому-как не было ни время на gui (как обычно результат был нужен вчера - об автоматизации начинают думать всерьез когда понимают, что уже ничего не успевают), ни полного понимания что надо реализовать, да и выходной формат помимо "визуализации", требовал частично и данных в xml. После чего он уже был "переведен" на СУБД.

Оффлайн sergolgaАвтор темы

  • ADN OPEN
  • Сообщений: 31
  • Карма: 0
построить параметрическую модель изделия
Не понимаю зачем использовать Эксель, когда есть такие замечательные вещи, как xml, linq to xml, binding? Все данные можно отлично хранить. Сериализация и десериализация ускоряют процесс сохранения и загрузки данных. В общем - быстро, легко и удобно
О, к сожалению, все из указанного Вами, кроме Экселя - для меня малознакомые понятия (из серии: слышал звон, да не знаю где он), разбираться с которыми я буду долго (я не профессиональный программист), хоть и разберусь в конечном итоге, но времени... . А вот Эксель, тот костыль с готовым интерфейсом, который я знаю наизусть и как пользователь и как программист (еще по VBA).
:) Ну, это как: на чем быстрее я доеду в другой город, если на выбор дают автомобиль и велосипед. Казалось бы ответ однозначный... Ан, нетушки: я ж водить не умею, только педали кручу, а водитель к выбору не прилагается. :)

Поэтому сначала побыстрее, на том что знаю, потом на том, что правильно! А из правильного, углубившись по совету Александра, я пока сильно склоняюсь к XRecords и NOD. Стороннюю БД (вне файла автокад), в моем случае можно не рассматривать. DropBox, через который работают пользователи создает версии файла, если с ним одновременно работают несколько человек - вот и сиди потом, думай какой dwg к какой базе привязать - лишний головняк.

Но в любом случае, спасибо за совет и участие. Дополнительная информация и способы это всегда полезно. Не сейчас, так потом пригодится.
Не считайте себя умнее! (Даже если Ваш оппонент - женщина.:)))
Лучше день потерять, а потом за 2 минуты долететь!