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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Транзакции AutoCAD .NET DLL

Транзакции AutoCAD .NET DLL

Ответ
Поиск в этой теме
Непрочитано 07.04.2012, 01:28 #1
Транзакции AutoCAD .NET DLL
Дмитрий Асташев
 
päällikön suunnittelijat
 
Pietari, Venäjä
Регистрация: 04.12.2010
Сообщений: 63

Коллеги, доброе время суток!

После того, как "Hello World" был освоен, я почувствовал себя крутым программистом и сразу захотелось все улучшить и дополнить.
В первую очередь, разумеется, огорчило отсутствие возможности выгрузки сборки.

Далее появились вопросы
1 вопрос. - Ответ получен, спасибо, Дима_ Можно ли в одной транзакции создавать и записывать в базу несколько объектов? По аналогии с SQL, мы же не делаем новую транзакцию для каждой ячейки таблицы.

2 вопрос. - Ответ получен, спасибо, Дима_ Если в COM окружность создается в одну строку
ModelSpace.AddCircle(poind,radius)
а в .NET API для этого требуется экран кода, то возникает вопроc: кто-то уже писал для .NET API библиотеки с функциями типа MyAddCirce(poind,radius), включающую в себя, разумеется, весь упомянутый экран кода, или же мне придется пройти весь этот тернистый путь заново, для каждого предполагаемого к использованию примитива, ориентируясь на вызовы аналогичной функции в COM?

3 вопрос.если для Sub все делается внутри транзакции, то как быть с Function? Return по идее должен быть после Commit.
Допустим, функция должна возвращать выбранный примитив, и мы его хотим редактировать. Но ведь транзакция закрыта! Как правильно нужно делать?

Последний раз редактировалось Дмитрий Асташев, 02.09.2012 в 22:25.
Просмотров: 3331
 
Непрочитано 07.04.2012, 02:14
1 | #2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


У вас по сути 2 вопроса в одном, "экран кода" требуется для "настройки" транзакции - внутри которой примитивов может создаваться, удаляться и меняться произвольное количество (каждый тоже примерно в 1 строку).
p.s. Библиотеки такие есть - это COM.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 07.04.2012, 08:59
#3
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Спасибо, все понятно.
Дмитрий Асташев вне форума  
 
Автор темы   Непрочитано 02.09.2012, 22:21
#4
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Цитата:
Сообщение от Дима_ Посмотреть сообщение
транзакции - внутри которой
Друзья, подскажите, если для Sub все делается внутри транзакции, то как быть с Function? Return по идее должен быть после Commit.
Допустим, функция должна возвращать выбранный примитив, и мы его хотим редактировать. Но ведь транзакция закрыта! Как правильно нужно делать?
Дмитрий Асташев вне форума  
 
Непрочитано 03.09.2012, 00:05
#5
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


В функции ты можешь использовать транзакцию как аргумент,
а в вызывающей команде (Sub) , будет использоваться другая транзакция,
главное чтобы функция возвращала то что нужно, например ObjectId
какого-нибудь объекта и тд
Еще можно использовать в функции одну и ту же транзакцию, что и в вызывающей команде,
но в этом случае не закрывать её, а передавать подтверждение транзакции в основную команду
в этом случае не нужно использовать Using ... End Using для транзакции и тем более Abort()
Экспериментируй...

~'o'~
Олег (jr.) вне форума  
 
Непрочитано 03.09.2012, 11:05
#6
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


2. В процессе написания программок, накапливаются некоторые функции, в том числе добавления примитивов, слоев и прочего... со временем само накопится, не парься =о)
3. Т.к. акад позволяет работать со вложенными транзакциями, то грех этим не пользоваться.
Потому внутри каждой функции открываю свою транзакцию и закрываю по завершению функции. Получается наглядно и не надо следить за транзакциями.
Boxa вне форума  
 
Непрочитано 03.09.2012, 11:18
#7
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Boxa Посмотреть сообщение
и не надо следить за транзакциями.
Но при этом обязательно нужно помнить о необходимости вызова Commit не только для текущей, но и для родительских транзакций.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 05.09.2012, 01:06
#8
Дмитрий Асташев

päällikön suunnittelijat
 
Регистрация: 04.12.2010
Pietari, Venäjä
Сообщений: 63


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
главное чтобы функция возвращала то что нужно, например ObjectId
Так получается, нельзя вернуть "сам примитив", а можно только его ObjectID. Логично.
Что самое смешное, программа работает, если функция возвращает "сам примитив", до завершения транзакции, хотя это неправильно.
То есть, такая логика тоже работает:
Код:
[Выделить все]
    Public Function MyFunction() As Polyline
        Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
        Dim acCurDb As Database = Application.DocumentManager.MdiActiveDocument.Database
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Dim pline As Polyline
            .....
            Return pline
            acTrans.Commit()
        End Using
    End Function

    Public Sub MySub(pline As Polyline)
        Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
        Dim acCurDb As Database = Application.DocumentManager.MdiActiveDocument.Database
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
           1:Do(something)
           2:?????
           3:PROFIT()
           acTrans.Commit()
        End Using
    End Sub
Дмитрий Асташев вне форума  
 
Непрочитано 05.09.2012, 02:16
#9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Дмитрий Асташев Посмотреть сообщение
Так получается, нельзя вернуть "сам примитив", а можно только его ObjectID
Если совсем точно то вернуть-то можно что угодно - другое дело с чем потом можно (или ожидается) "работать".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 05.09.2012, 09:13
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,407
Отправить сообщение для Александр Ривилис с помощью Skype™


Дмитрий Асташев
В твоей функции MyFunction при Return pline происходит неявный вызов acTrans.Abort(), т.к. вызова acTrans.Commit() не было. Т.к. acTrans у тебя в блоке Using, то это приводит к вызову acTrans.Dispose(), а это в свою очередь если не было acTrans.Commit() приводит к вызову acTrans.Abort().
Подумай над этим.
P.S.: Если у тебя есть ObjectId объекта, то ты можешь получить сам объект без транзакции, а при помощи метода ObjectId.GetObject()
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Транзакции AutoCAD .NET DLL

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Net. Создание и модификация материала Павлюкас Готовые программы 27 08.12.2010 10:17
Правило формирование записей в реестре об установленных обновлениях для AutoCAD и его вертикальных решений. hwd Программирование 8 30.09.2010 15:07
Где в реестре хранится информация о том, что в системе когда-то был установлен AutoCAD? Archeo AutoCAD 12 14.10.2009 15:24
Проблемы с .NET v2 в Autocad 2006 (acad.exe.config)... Chief Justice AutoCAD 2 12.08.2006 12:44