Создано в программе Autodesk для учебных заведений

Автор Тема: Создано в программе Autodesk для учебных заведений  (Прочитано 78695 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр Наумович, по быстрому попробовал проверить - чего-то не работает.
Проверил и исправил. Не хватало одного try/catch.
« Последнее редактирование: 28-11-2014, 15:18:26 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Предложите другой 
Информацию в реестре о наличии\отсутствии SP для текущей версии AutoCAD я бы искал следующим образом:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Microsoft.Win32;
  6.  
  7. #if AUTOCAD
  8. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  9. using Ap = Autodesk.AutoCAD.ApplicationServices;
  10. using Db = Autodesk.AutoCAD.DatabaseServices;
  11. using Ed = Autodesk.AutoCAD.EditorInput;
  12. using Rt = Autodesk.AutoCAD.Runtime;
  13. using Hs = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices;
  14. using Us = Autodesk.AutoCAD.DatabaseServices.SymbolUtilityServices;
  15. #endif
  16.  
  17. [assembly: Rt.CommandClass(typeof(Bushman.CAD.Sandbox.Commands))]
  18.  
  19. namespace Bushman.CAD.Sandbox {
  20.     public sealed class Commands {
  21.  
  22.         [Rt.CommandMethod("Test")]
  23.         public void Test() {
  24.             Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  25.             if (null == doc)
  26.                 return;
  27.  
  28.             Ed.Editor ed = doc.Editor;
  29.  
  30.             Version old = new Version(18, 2);
  31.             String appPath = String.Empty;
  32.  
  33. #if CAD_NEWER_THAN_18_2
  34.             appPath = Hs.Current.MachineRegistryProductRootKey;
  35. #else
  36.             appPath = Hs.Current.RegistryProductRootKey;
  37. #endif
  38.             String spParentPath = String.Empty;
  39.             if (cad.Version > old) {
  40.                 Int32 len = appPath.IndexOf(':');
  41.                 spParentPath = appPath.Substring(0, len);
  42.             }
  43.             else {
  44.                 spParentPath = appPath;
  45.             }
  46.  
  47.             using (RegistryKey appKey = Registry.LocalMachine.OpenSubKey(
  48.                 spParentPath)) {
  49.                 using (RegistryKey spKey = appKey.OpenSubKey("Service Packs")) {
  50.  
  51.                     if (null != spKey && 0 != spKey.GetSubKeyNames().Length) {
  52.                         String patchTitle = spKey.OpenSubKey(spKey
  53.                             .GetSubKeyNames()[0]).GetValue("PatchTitle",
  54.                             String.Empty).ToString();
  55.                         ed.WriteMessage("{0}\n", patchTitle);
  56.                     }
  57.                     else {
  58.                         ed.WriteMessage("Service Packs is not installed.\n");
  59.                     }
  60.                     if (null != spKey) {
  61.                         spKey.Close();
  62.                     }
  63.                 }
  64.             }
  65.         }
  66.     }
  67. }
« Последнее редактирование: 28-11-2014, 15:54:05 от Андрей Бушман »

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Подправил код: добавил обработку IDisposable.

UPD Мне почему-то запомнилось, что в .Net 3.5 класс RegistryKey не имел реализацию IDisposable, в виду чего я и предложил сначала такой вариант:
Код - C# [Выбрать]
  1. foreach (RegistryKey rk in new RegistryKey[] { spKey, appKey }) {
  2.         rk.Close();
  3.         if (rk is IDisposable) {
  4.                 (rk as IDisposable).Dispose();
  5.         }
  6. }
Сейчас полез, проверил и вижу, что обозначенный класс реализует данный интерфейс и в .Net 3.5. В виду этого отредактировал код, оформив вызов Dispose посредством блоков using, а так же добавил один блок else, пропущенный мною (всплыл при тестировании в AutoCAD 2009).
« Последнее редактирование: 28-11-2014, 15:51:57 от Андрей Бушман »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Информацию в реестре о наличии\отсутствии SP для текущей версии AutoCAD я бы искал следующим образом:
А я бы сделал проще: проверил значение системной переменной _VERNUM. Для AutoCAD 2014 SP1:
Цитировать
Command: _VERNUM
_VERNUM = "I.108.0.0 (UNICODE)" (read only)
Думаю что для Civil 3D 2014 SP1 аналогичное значение. Но можно проверить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Спасибо за идею
C3D без SP: _VERNUM = "I.18.0.0 (UNICODE)"
C3D c  SP1: _VERNUM = "I.108.0.4 (UNICODE)"

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо за идею
C3D без SP: _VERNUM = "I.18.0.0 (UNICODE)"
C3D c  SP1: _VERNUM = "I.108.0.4 (UNICODE)"
Соответственно достаточно проверки первых 5 байт на "I.108"
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
C3D c SP2 _vernum: "I.108.0.11 (UNICODE)"

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
C3D c SP2 _vernum: "I.108.0.11 (UNICODE)"
В нем же тоже нет уведомления об учебной версии?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Да - c SP2 I.108.0.11 тоже нету сообщения, а штемпель в файле есть.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Тогда это моё предположение остаётся в силе:
Соответственно достаточно проверки первых 5 байт на "I.108"
И его лучше всего проверять перед подпиской на событие DocumentLockModeChanged. Если не "I.108", то и подписывать незачем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Valery Brelovsky

  • ADN Club
  • Сообщений: 24
  • Карма: 1
А вот крамольный вопрос. Работаю я это приложение запустил, проверил всё нормально версия не учебная, а потом вставил блок который подпорчен и имеет сообщение о учебной версии. Вопрос в том что при вставке блока сообщение о учебной версии буде работать?  Или,  когда начну загружать файл, узнаю об этом. :)  Это к том у что пару дней я работал с файлом учебной версии, перенёс в свой из подпорченного файла что либо. А в процессе работы изменял, блоки и сохранял их из этого файла в свою библиотеку. Первое я не знаю когда файл стал с сообщением, а узнал уже десяток другой блоков менял. Теперь эти блоки будут вставляться в другие файлы.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вопрос в том что при вставке блока сообщение о учебной версии буде работать?
А попробовать самому? ;) Думаю, что если ты вставишь такой "испорченный" блок это сообщение появится сразу после окончания команды вставки.
P.S.: У тебя задача разбивается на две:
1) Исправить уже испорченные чертежи.
2) Не допустить порчу новых чертежей.
Так вот EmrInfo.dll решает только вторую задачу. А первую задачи ты можешь решить или при помощи AutoCAD 2015, который при сохранении чертежа эту метку убирает или при помощи DWG TrueView 2015 (в составе которого DWG TrueConvert), которые тоже позволяет убрать метку.
« Последнее редактирование: 05-06-2015, 20:45:27 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Valery Brelovsky

  • ADN Club
  • Сообщений: 24
  • Карма: 1
А попробовать самому?
Спасибо. Попробовать конечно можно, но дело в том что сегодня не знаю какие блоки и файлы у меня подпорчены. От того и вопрос, что бы знать к чему готовится. И потом я говорю о последней сессии когда обнаружил о таком приколе и это около 20 блоков. В конечном итоге, всё может оказаться значительно веселее.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробовать конечно можно, но дело в том что сегодня не знаю какие блоки и файлы у меня подпорчены.
Т.е. вопрос заключается в том, что необходима массовая проверка dwg-файлов на наличие в них заразы? Например, проверить все dwg-файлы в заданном подкаталоге?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Valery Brelovsky

  • ADN Club
  • Сообщений: 24
  • Карма: 1
необходима массовая проверка
Смотрите. Я с помощью вашего приложения справлюсь со своими проблемами, а контора пока не готова к этому. С момента как начал разбираться выяснил,  первое, что при наличии штампа "Учебной версии" в 2014 версии на плоттер она не выходит. В общем, внутри конторы это как бы не вопрос. У нас в конторе у всех  2014. Есть только одна 2012. На ней я и тестировал этот момент. Т.е. вроде печать нормально в пределах конторы. А вот отправляя на сторону файл DWG, там могут оказаться не только 2014 но и ранние версии. Я выразил это мнение, пока начальство молчит. Исходя из этого свои огрехи я выловлю по ходу. А вопрос проверки всех файлов в конторе не могу сказать. Менталитет и логика израильтян, не всегда вписывается в наши понятия. Они типа живут сегодняшним днём. Что будет завтра, будет завтра тогда и будет искаться решение.  Я сказал, что есть версия на английском для проверки наличия штампа об учебной версии.  У меня стоит сейчас сообщение на русском, но чуть позже переведу  на английскую.  Когда отсутствую, могут  сесть за компьютер и открыть файл. Если будет файл со штампом то получат сообщение, что бы им было понятно, о чём речь.
Вкратце так.

Вот возникла одна проблема. При автосохранении файла пишет что Присутствует штамп учебной версии. Ситуация была такая. Вставлял блок получил сообщение что блок имеет штамп учебной версии. Нашёл файл блока открыл получил сообщение о штампе персохранил в DXF. Закрыл файл, потом открыл файл DXF и сохранил DWG. При последующем отрытии собщение о штампе отсутсвовало. Потом обнововил блоки в файле в который вставлял, и там сообщение исчезло, анологично при открытии файла сообщение о штампе отсутсвовалло. Но при автосообщении выскакивает сообщение что штамп есть. Я пару раз вызрузил и загрузил файл сообщения не было.

« Последнее редактирование: 07-06-2015, 09:39:26 от Valery Brelovsky »