Работа в Пользовательской системе координат!

Автор Тема: Работа в Пользовательской системе координат!  (Прочитано 16937 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
if (get_object.ToString() == "DBPoint")
Это бред. Так лучше:
Код - C# [Выбрать]
  1. DBObject get_object = acDocTr.GetObject(id_object, OpenMode.ForWrite, true);
  2. DBPoint ptk = get_object as DBPoint;
  3. if (ptk != null)
  4. {
  5.    // get_object действительно DBPoint
  6.    // и мы можем с ним работать как с DBPoint
  7. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Хм... помнится рекомендвли делать как-то так, политика партии сменилась?
Код - C# [Выбрать]
  1.             if (ObjID.ObjectClass.IsDerivedFrom(Rtm.RXClass.GetClass(typeof(Db.Entity))))
  2.             {
  3.                 using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
  4.                 {
  5.                     //тут что то делаем с объектом...
  6.                     Db.DBObject acEnt = acTrans.GetObject(ObjID, Db.OpenMode.ForRead) as Db.DBObject;
  7.                 }
  8.             }

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Хм... помнится рекомендвли делать как-то так, политика партии сменилась?
Пара замечаний к коду: во первых, ты показываешь вариант работы без использования транзакции; во вторых - в коде ты не выполняешь фиксацию или откат выполненных изменений. В виду этого не понятно: либо так задумано (т.е. ты по умолчанию выполняешь откат изменений), либо просто забыл это сделать. Я считаю, что всегда нужно чётко обозначать свои намерения, дабы таких сомнений не возникало. Если изменений не было, то рекомендуется фиксировать, вместо отката, т.к. фиксация работает быстрее.

По поводу "политики партии": имхо - оба способа имеют право на жизнь. Какой из них быстрее - это нужно замерять (я не сравнивал). Мне импонирует использование IsDerivedFrom, т.к. этот вариант сразу возвращает логическое значение, в виду чего отпадает необходимость последующего сравнения на равенство null.

Если говорить о сравнении, то я предпочитаю писать так:

Код - C# [Выбрать]
  1. if (null != ptk) {
  2.    // get_object действительно DBPoint
  3.    // и мы можем с ним работать как с DBPoint
  4. }
Применительно к C# это роли не играет, но взять такой вариант в привычку полезно, если помимо C# ты пишешь и на др. языках программирования, например на C или C++, где любое значение может интерпретироваться как логическое. Например, если ты в C++ сделаешь опечатку:
Код - C++ [Выбрать]
  1. if (ptk = nullptr)
то компилятор это "скушает" и не будет ругаться. А работать программа будет неверно. Если же опечатка выглядит так:
Код - C++ [Выбрать]
  1. if (nullptr = ptk)
то такой номер не пройдёт.

UPD
хотя... Применительно к C# это тоже имеет место быть:
Код - C# [Выбрать]
  1. // здесь 'a' - это переменная типа Boolean.
  2. if (a = false) { // если программист предпочитает сравнивать с false, вместо инвертирования значения: !a.
  3.    // get_object действительно DBPoint
  4.    // и мы можем с ним работать как с DBPoint
  5. }

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Не усложняй. Я просто показал, что вместо открытия объекта на запись и приведения типов, рекомендовалось сначала узнать тип объекта и если он "правильный", начинать с ним работать. Ничего кроме этого.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Хм... помнится рекомендвли делать как-то так, политика партии сменилась?
Ты думаешь ТС поймёт эту форму записи? Ему еще учить и учить C#. Ну и кроме того указанный мной код работает во всех версиях AutoCAD в которых есть .NET API, а указанный тобой только с AutoCAD 2009. Это я на всякий случай уточняю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
указанный мной код работает во всех версиях AutoCAD в которых есть .NET API, а указанный тобой только с AutoCAD 2009
Спасибо. запомню.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Спасибо большое! )) блин ты тут один на весь форум новичкам помогаешь?

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Если говорить о сравнении, то я предпочитаю писать так:
Немного оффтоп - но все же - я настолько проникся идеей шаблонов (F#) что, по факту, у меня в коде if как таковой практически не встречается (свои скопипащенные библиотеки не в счет). Более того - он мне стал казаться каким-то неуклюжим - вплоть до того что даже функции которые возвращают "булевое" значение все равно сравниваю через соответствующий шаблон |true->... |false->... так и программа "структурированней" и гибкость к изменению гораздо выше - про автоматический разбор и преобразование - я уже молчу.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо большое! ))
Пожалуйста. С моим кодом разобрался?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение