ADN Open CIS
Сообщество программистов Autodesk в СНГ

13/05/2015

Управление SummaryInfo чертежа при помощи ObjectARX

Вам может понадобиться изменить свойства «Автор изменений» ("Last saved by") и «Редакция» ("Revision number"), а также другие пользовательские свойства чертежа. Класс AcDbDatabaseSummaryInfo из ObjectARX SDK вам поможет. Эквивалент в AutoCAD .Net API - структура "DatabaseSummaryInfo". Но в отличие от C++, некоторые свойства, такие как "LastSavedBy" и "RevisionNumber" только для чтения в .NET. Вы можете воспользоваться COM API для получения и установки этих свойств. Это особенно удобно в случае, когда вы управляете AutoCAD из внешнего приложения или используете VBA.

После того как свойство "LastSavedBy" изменено, важно сохранить базу под другим именем. Если этого не сделать, то команда _SAVE  AutoCAD автоматически использует системный логин и сохранит его в этом поле.

Ниже образец кода ObjectARX C++ для установки свойства «Автор изменений» и «Редакция» и получения других свойств. 

Код - C++: [Выделить]
  1. Acad::ErrorStatus es;    
  2. AcDbDatabaseSummaryInfo *pInfo;   
  3. AcDbDatabase *pCurDb = NULL;   
  4. ACHAR* info;   
  5. ACHAR* key;   
  6. ACHAR* value;
  7. int  customQty;
  8. int  index; 
  9. pCurDb = acdbHostApplicationServices()->workingDatabase();
  10.  
  11. // Указатель на SummaryInfo текущей базы
  12. es = acdbGetSummaryInfo(pCurDb, pInfo);  
  13. acutPrintf(L"\nСвойства этого чертежа:" );
  14. es = pInfo->getTitle(info); 
  15. if (info)
  16. {  
  17.   acutPrintf(L"\nНазвание = %s" , info);  
  18. }   
  19.  
  20. es = pInfo->getSubject(info);   
  21. if (info)   
  22. {
  23.   acutPrintf(L"\nТема = %s" , info);  
  24. }   
  25.  
  26. es = pInfo->getAuthor(info);   
  27. if (info)
  28. {       
  29.   acutPrintf(L"\nАвтор = %s" , info);   
  30. }   
  31.  
  32. es = pInfo->getKeywords(info);   
  33. if (info)  
  34. {   
  35.   acutPrintf(L"\nКлючевые слова = %s" , info);  
  36. }  
  37.  
  38. es = pInfo->getComments(info);  
  39. if (info)  
  40. {      
  41.   acutPrintf(L"\nКомментарий = %s" , info);   
  42. }   
  43.  
  44. es = pInfo->setLastSavedBy(L"Captain CAD" );   
  45. es = pInfo->getLastSavedBy(info);
  46. acutPrintf(L"\nАвтор изменений = %s" , info);  
  47.  
  48. es = pInfo->getHyperlinkBase(info); 
  49. if (info)  
  50. {
  51.   acutPrintf(L"\nБаза гиперссылки = %s" , info);   
  52. }
  53.  
  54. es = pInfo->setRevisionNumber(L"1" );
  55. es = pInfo->getRevisionNumber(info);   
  56. acutPrintf(L"\nРедакция = %s" , info);   
  57. customQty = pInfo->numCustomInfo();   
  58. if (customQty > 0)   
  59. {       
  60.   acutPrintf(L"\nПользовательская информация:\n" );       
  61.   acutPrintf(L"\nИмя\t\tЗначение\n" );       
  62.   for (index = 0; index < customQty; index++)       
  63.   {           
  64.     pInfo->getCustomSummaryInfo(index, key, value);           
  65.     if (key)           
  66.     {              
  67.       acutPrintf(L"\n%s" , key);           
  68.     }           
  69.     if (value)         
  70.     {
  71.       acutPrintf(L"\t\t%s" , value);
  72.     }
  73.     acdbFree(key);
  74.     acdbFree(value);
  75.   }   
  76. }
  77. else
  78. {
  79.   acutPrintf(L"\n\nВ чертеже нет никаких пользовательских свойств");  
  80. }
  81. es = acdbPutSummaryInfo(pInfo);   
  82. acdbFree(info);
  83.  
  84. pCurDb->saveAs(ACRX_T("D:\\Temp\\MyTestArx.dwg" ));

Для установки свойств при помощи  COM API:

Код - VBA: [Выделить]
  1. oAcadApp.ActiveDocument.Database.SummaryInfo.LastSavedBy = "Autodesk"
  2. MsgBox(oAcadApp.ActiveDocument.Database.SummaryInfo.LastSavedBy)
  3. oAcadApp.ActiveDocument.SaveAs("D:\\Temp\\MyTest.dwg" )

 

Источник: http://adndevblog.typepad.com/autocad/2015/04/manipulate-drawing-summaryinfo-using-objectarx.html

 

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=2700

Опубликовано 13.05.2015