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

10/12/2015

Как запустить редактор мультитекста?

Вопрос:

Как в ObjectARX и AutoCAD .NET API запустить встроенный редактор мультитекста?

Ответ:

Начиная с версии AutoCAD 2011 для редактирования мультитекста в ObjectARX имеется класс AcEdInplaceTextEditor и класс InplaceTextEditor в AutoCAD .NET API. Ниже примеры использования:

Код - C++: [Выделить]
  1. #include "StdAfx.h"
  2. #include <AcEdInplaceTextEditor.h>
  3. #include "resource.h"
  4. //-----------------------------------------------------------------------------
  5. #define szRDS _RXST("")
  6. //-----------------------------------------------------------------------------
  7. //----- ObjectARX EntryPoint
  8. class CMTextEditorApp : public AcRxArxApp {
  9. public:
  10.   CMTextEditorApp () : AcRxArxApp () {}
  11.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  12.     AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  13.     return (retCode) ;
  14.   }
  15.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  16.     AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  17.     return (retCode) ;
  18.   }
  19.   virtual void RegisterServerComponents () {
  20.   }
  21.   static void RivilisMTEditor () {
  22.     ads_point pt;
  23.     ads_name en;
  24.     if (acedEntSel(_T("\nВыберите мультитекст: "), en, pt) == RTNORM)
  25.     {
  26.       AcDbObjectId eId; acdbGetObjectId(eId, en);
  27.       AcDbObjectPointer<AcDbMText> pMtext(eId, AcDb::kForWrite);
  28.       Acad::ErrorStatus es = pMtext.openStatus();
  29.       if (es == Acad::eNotThatKindOfClass) {
  30.         acedPrompt(_T("\nЭто не мультитекст!"));
  31.         return;
  32.       } else if (es != Acad::eOk) {
  33.         acutPrintf(_T("\nОшибка: %s"), acadErrorStatusText(es));
  34.         return;
  35.       }
  36.       // Объект редактора MTEXT:
  37.       AcEdInplaceTextEditor *pTextEditor = AcEdInplaceTextEditor::current();
  38.       // Установки редактора:
  39.       AcEdInplaceTextEditorSettings *pTextEditorSettings = new AcEdInplaceTextEditorSettings();
  40.       // Запускаем редактирование
  41.       if (pTextEditor->invoke(pMtext, pTextEditorSettings) != Acad::eOk) {
  42.         pMtext->cancel();
  43.       }
  44.       delete pTextEditorSettings;
  45.     }
  46.   }
  47. } ;
  48. //-----------------------------------------------------------------------------
  49. IMPLEMENT_ARX_ENTRYPOINT(CMTextEditorApp)
  50. ACED_ARXCOMMAND_ENTRY_AUTO(CMTextEditorApp, Rivilis, MTEditor, MTEditor, ACRX_CMD_MODAL, NULL)

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5.  
  6. [assembly: CommandClass(typeof(MTextEditor.Test))]
  7.  
  8. namespace MTextEditor
  9. {
  10.   public class Test
  11.   {
  12.     [CommandMethod("MTEditor")]
  13.     public void MTEditor()
  14.     {
  15.       Document doc = Application.DocumentManager.MdiActiveDocument;
  16.       if (doc == null) return;
  17.       Editor ed = doc.Editor;
  18.       PromptEntityOptions pr = new PromptEntityOptions("\nВыберите мультитекст");
  19.       pr.SetRejectMessage("Это не мультитекст!");
  20.       pr.AddAllowedClass(typeof(MText), false);
  21.       PromptEntityResult rs = ed.GetEntity(pr);
  22.       if (rs.Status != PromptStatus.OK) return;
  23.       using (MText mt = rs.ObjectId.Open(OpenMode.ForWrite) as MText)
  24.       {
  25.         InplaceTextEditor.Invoke(mt, new InplaceTextEditorSettings());
  26.       }
  27.     }
  28.   }
  29. }

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

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

Опубликовано 10.12.2015
Отредактировано 10.12.2015 в 01:45:58