Тема: Обновление размороженного мультитекста

Здравствуйте ...

Метод создаёт мультитекст ... ставит его на выбранный слой и если он заморожен то размораживает его...
проблема в том что желательно, чтобы имеющиеся мультитексты на этом слое которые были до этого заморожены и перестали быть видимы пользователю отобразились при установке нового мультитекста ...
а этого не происходит хотя слой и размораживается и происходит регенерация ...

Вот фрагмент кода осуществляющего разморозку:
if(pLayerTableRecord->isFrozen()==true){
    Status=pLayerTableRecord->setIsFrozen(false);
        if(Status!=Acad::ErrorStatus::eOk){
            acutPrintf(_T("\nНе удалось разморозить слой"));
            return false;
        }
           acutPrintf(_T("\nСлой разморожен"));                  
    }
ads_regen();

Может кто нибудь знает как решить эту проблему ... ?

Re: Обновление размороженного мультитекста

В этом коде слой не закрыт перед регенерацией.

Re: Обновление размороженного мультитекста

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

В этом коде слой не закрыт перед регенерацией.

if(pLayerTableRecord->isFrozen()==true){
    Status=pLayerTableRecord->setIsFrozen(false);
    if(Status!=Acad::ErrorStatus::eOk){
    acutPrintf(_T("\nНе удалось разморозить слой"));
    return false;
    }
         acutPrintf(_T("\nСлой разморожен"));                  
}
pLayerTableRecord->close();
ads_regen();

Пробовал закрывать и запись и таблицу слоёв ...
все равно мои мультитексты на этом слое не обновляются ...
в то время как разморозка слоя происходит и текущий мультитекст который ставится нормально отображается ...

Re: Обновление размороженного мультитекста

Константин пишет:

все равно мои мультитексты на этом слое не обновляются ...

Только мультитексты или другие примитивы (отрезки, полилинии, тексты и т.д.) тоже?

Re: Обновление размороженного мультитекста

Вообще поначалу думал что только мультитексты, потому что мультивыноски почему то пару раз отобразились ... видимо это было связано с какими то моими действиями в автокаде ...
Видимо никакие примитивы, установленные моей программой не отображаются после размораживания слоя на котором находятся ...

(изменено: Александр Ривилис, 22 июня 2009г. 00:42:13)

Re: Обновление размороженного мультитекста

Тогда давай полный код, версию AutoCAD (наличие SP), версию ObjectARX. Иначе это гадание на кофейной гуще. Из предположений - не закрытые примитивы, таблицы (слои, блоки и т.д.), выполнение кода из модального/немодального диалога. Если выполнить _REGEN после завершения твоего кода, то тоже ничего не отображается?
P.S.: И не забывай про теги [code] ... [/code], иначе текст программы прочесть крайне сложно...

Re: Обновление размороженного мультитекста

AutoCad 2007  2008
ObjectARX 2007

В конце программы ставил ads_regen() и в других частях ... не помогает ...

Текст класса ... :

Source file :

void ads_regen();

M_Legend_Shaper::M_Legend_Shaper(M_Legend::MultilevelText& LegendText)
{
    this->LegendText=LegendText;
     pBlockTbl=NULL;
     MText=new AcDbMText();
     Contour=new AcDb2dPolyline();
     Angle=0;
     pRecord= new AcDbBlockTableRecord();
     Attachment =AcDbMText::AttachmentPoint::kBottomLeft;
     //Contour=new AcDbEntity();
     if(!GetHeight(Height)){
         Height=10;
     }
     Layer=_T("0");
     // Открываем БД текущего рисунка и получаем указатель на таблицу блоков
    // Получаем указатель на пространство модели как блок ACDB_MODEL_SPACE
    // открываем его для записи
    if(SetPointers()!=isAllowably){
        AfxMessageBox(_T("Возникли проблемы при открытии БД текущего рисунка или не получен один из важных указателей"));
    }
    SetStyle(L"Standard");
  
    CString TempText=ConvertMultilevelText(LegendText);
    The_second_point_is_established=false;
    The_point_is_established_at_preliminary_viewing=false;
}
M_Legend_Shaper::ShaperError M_Legend_Shaper::GetPointAnd2DPolyline(){
     AcDbObjectId objIdContour;
     ads_name entres;
       if( acedEntSel(_T("\n"),entres,BeginningPoint)!=RTNORM){
            acutPrintf(_T("Контур не выбран\n"));
            return isError;
       }
       else {
       }
       acdbGetObjectId(objIdContour,entres);
       if(Acad::eOk != acdbOpenObject(Contour,objIdContour,AcDb::kForRead)){
             acutPrintf(_T("Не открыт логически целостный элемент области\n"));
             return isError;
       }
       if (Contour->isA()!=AcDb2dPolyline::desc()){
           acutPrintf(_T("Выбранный объект не является 2d полилинией"));
           return isError;
       }
       return isAllowably;
}

M_Legend_Shaper::ShaperError M_Legend_Shaper::CreateLeader(){
    if(The_point_is_established_at_preliminary_viewing==false){
    if(The_second_point_is_established)
        return M_Legend_Shaper::ShaperError::isError;
    if (acedGetPoint(BeginningPoint, _T("\nУкажите положение текста технологической надписи:\n "), InvestigatePoint) != RTNORM){
              acutPrintf(_T("Точка не ввелась ... \n"));
       }
    The_second_point_is_established=true;
    }
    AcDbLeader* Leader=new AcDbLeader();
    Leader->appendVertex(Convert_adstoAcGe(BeginningPoint));
    Leader->appendVertex(Convert_adstoAcGe(InvestigateLeaderEndPoint));    
    Leader->enableArrowHead();
    Leader->setLayer(Layer.GetBuffer());
    if ((pRecord->appendAcDbEntity(Leader))!=Acad::eOk){
        acutPrintf(_T("\nОшибка добавления к БД мультитекста"));
        return isError;
    }
    Leader->close();
    return M_Legend_Shaper::ShaperError::isAllowably;
}

AcGePoint3d M_Legend_Shaper::Convert_adstoAcGe(ads_point& Point){
    AcGePoint3d AcGePoint3dPoint;
    CString m_strXPt;
    CString m_strYPt;
    CString m_strZPt;

        m_strXPt.Format(_T("%g"), Point[X]);
        m_strYPt.Format(_T("%g"), Point[Y]);
        m_strZPt.Format(_T("%g"), Point[Z]);

    acdbDisToF(m_strXPt, -1, &Point[X]);
    acdbDisToF(m_strYPt, -1, &Point[Y]);
    acdbDisToF(m_strZPt, -1, &Point[Z]);

    AcGePoint3dPoint.x=_tstof(m_strXPt.GetBuffer());
    AcGePoint3dPoint.y=_tstof(m_strYPt.GetBuffer());
    AcGePoint3dPoint.z=_tstof(m_strZPt.GetBuffer());

    return AcGePoint3dPoint;
}
M_Legend_Shaper::ShaperError M_Legend_Shaper::SetPointers(){
      AcAxDocLock dblock(acdbCurDwg());
             if(dblock.lockStatus() != Acad::eOk) {
                 acutPrintf(_T("\nНе удалось заблокировать базу"));
                 return isNotOpen;
              }

       if(acdbCurDwg()->getBlockTable(pBlockTbl, AcDb::kForRead)!=Acad::eOk){
            acutPrintf(_T("\nНе удалось получить блок"));
          
            return isNotOpen;
        }
        if(pBlockTbl->getAt(ACDB_MODEL_SPACE, pRecord, AcDb::kForWrite)){
            acutPrintf (_T("\nНет доступа к блоку *Model_Space. ")) ;
           
            return isNotOpen;
        }
        return isAllowably;
}

CString M_Legend_Shaper::ConvertMultilevelText(M_Legend::MultilevelText& LegendText){
    CString Text=L"";
    if(LegendText.AboveText!=L""){
          TextFlag=ViewText::AboveText;
    }
    else {
        if(LegendText.BelowText!=L""){
          TextFlag=ViewText::BelowText;
        }
        else {
          TextFlag=ViewText::LineText;
        }
    }
    if((LegendText.AboveText!=L""||LegendText.BelowText!=L"")&&LegendText.ReverseText!=L""){
        Text=L"\\A1;{\\H0.7x;\\S"+LegendText.AboveText+L"/"+LegendText.BelowText+L";}"+LegendText.ReverseText;
        return Text;
    }
    if((LegendText.AboveText!=L""||LegendText.BelowText!=L"")&&LegendText.FrontText!=L""){
        Text=L"\\A1;"+LegendText.FrontText+L"{\\H0.7x;\\S"+LegendText.AboveText+L"/"+LegendText.BelowText+L";}";
       
        return Text;
    }
    if((LegendText.AboveText==L""&&LegendText.BelowText==L"")&&LegendText.FrontText!=L""){
        Text=LegendText.FrontText;
        return Text;
    }
    if((LegendText.AboveText==L""&&LegendText.BelowText==L"")&&LegendText.ReverseText!=L""){
        Text=LegendText.ReverseText;
        return Text;
    }
    return Text;
}
bool M_Legend_Shaper::PreliminaryViewingText(){
    The_point_is_established_at_preliminary_viewing=true;
     struct resbuf rbFrom, rbTo;
      rbFrom.restype = RTSHORT;
    rbFrom.resval.rint = 1;
    rbTo.restype = RTSHORT;
    rbTo.resval.rint = 0;

    MLegendJig *pLegendJig
        = new MLegendJig(Convert_adstoAcGe(BeginningPoint),Convert_adstoAcGe(InvestigatePoint),Contour,TextFlag);
    pLegendJig->SetTextContent(ConvertMultilevelText(LegendText));
    pLegendJig->SetTextStyle(IdStyle);
    pLegendJig->SetTextHeight(Height);
    pLegendJig->SetTextAttachment(Attachment);

     pLegendJig->doIt();
    
     if(pLegendJig->inContour()==true){
       InvestigatePoint[0]=pLegendJig->GetSelectedMTextPoint().x;
       InvestigatePoint[1]=pLegendJig->GetSelectedMTextPoint().y;
       InvestigatePoint[2]=pLegendJig->GetSelectedMTextPoint().z;

       InvestigateLeaderEndPoint[0]=pLegendJig->GetSelectedLeaderEndPoint().x;
       InvestigateLeaderEndPoint[1]=pLegendJig->GetSelectedLeaderEndPoint().y;
       InvestigateLeaderEndPoint[2]=pLegendJig->GetSelectedLeaderEndPoint().z;

       InvestigateLineEndPoint[0]=pLegendJig->GetSelectedLineEndPoint().x;
       InvestigateLineEndPoint[1]=pLegendJig->GetSelectedLineEndPoint().y;
       InvestigateLineEndPoint[2]=pLegendJig->GetSelectedLineEndPoint().z;

       this->Angle=pLegendJig->GetSelectedAngle();
     }
    delete pLegendJig;
    return pLegendJig->inContour();
}

M_Legend_Shaper::ShaperError M_Legend_Shaper::CreateMText(){
    if(The_point_is_established_at_preliminary_viewing==false){

    if(The_second_point_is_established!=true){
           if (acedGetPoint(BeginningPoint, _T("\nУкажите положение текста технологической надписи:\n "), InvestigatePoint) != RTNORM){
              acutPrintf(_T("Точка не ввелась ... \n"));
              return isError;
           }
    }
    }
    AcGePoint3d TemporaryPoint=Convert_adstoAcGe(InvestigatePoint);

    Acad::ErrorStatus LgndErrorStatus;
        CString TempText=ConvertMultilevelText(LegendText);
        MText->setContents(TempText.GetBuffer());
        
        MText->setTextStyle(IdStyle);
        pRecord->appendAcDbEntity(MText->objectId(),MText);

        LgndErrorStatus=MText->setTextHeight(Height);
        LgndErrorStatus=MText->setAttachment(Attachment);

        LgndErrorStatus=MText->setLocation(TemporaryPoint);
        MText->setRotation(Angle);

        LgndErrorStatus=MText->setLayer(Layer.GetBuffer());
        
    return M_Legend_Shaper::ShaperError::isAllowably;
    
}

M_Legend_Shaper::~M_Legend_Shaper(void)
{
    
    Contour->close();
    MText->close();
    pRecord->close();
    pBlockTbl->close();
    
}
bool M_Legend_Shaper::SetLayer(CString Name){
    Acad::ErrorStatus Status;
    AcDbLayerTable * pLayerTable = NULL;
    ACHAR* pLayerName;
    Status=acdbCurDwg()->getLayerTable(pLayerTable, AcDb::kForWrite);
    if(Status!=Acad::ErrorStatus::eOk){
        acutPrintf(_T("Не удалось открыть таблицу слоёв"));
            return true;
        }
    AcDbLayerTableIterator * pLayerIterator = NULL;
    pLayerTable->newIterator(pLayerIterator);
    AcDbLayerTableRecord *pLayerTableRecord;
    bool flag=false;
    for (   ; !pLayerIterator->done(); pLayerIterator->step() ) 
    {
        
        // чтение данных очередного блока
        Status=pLayerIterator->getRecord(pLayerTableRecord, AcDb::kForWrite);
        if(Status!=Acad::ErrorStatus::eOk){
            acutPrintf(_T("Не удалось открыть запись из таблицы слоёв"));
            return true;
        }
        
        pLayerTableRecord->getName(pLayerName);
        CString Temp(pLayerName);
        
        if(Temp==Name){
            CString Temp;
            Temp=_T("\nНайден слой ")+Name;
                acutPrintf(Temp.GetBuffer());
                Layer=Name;
                flag=true;
                if(pLayerTableRecord->isFrozen()==true){
                    Status=pLayerTableRecord->setIsFrozen(false);
                    if(Status!=Acad::ErrorStatus::eOk){
                     acutPrintf(_T("\nНе удалось разморозить слой"));
                        return false;
                    } 
                       acutPrintf(_T("\nСлой разморожен"));               
                }    
                if(pLayerTableRecord->isOff()==true){
                    pLayerTableRecord->setIsOff(false);
                    acutPrintf(_T("\nСлой включен"));    
                }
                if(pLayerTableRecord->isLocked()==true){
                    pLayerTableRecord->setIsLocked(false);
                    acutPrintf(_T("\nСлой разблокирован"));    
                }
                pLayerTableRecord->close();
                break;    
        }
        pLayerTableRecord->close();// закрыть запись!
    }
    if(!flag){
        pLayerTableRecord=new AcDbLayerTableRecord();
          pLayerTableRecord->setName((ACHAR*)(Name.GetBuffer()));
          pLayerTable->add(pLayerTableRecord);
          Layer=Name;
          pLayerTableRecord->close();
    }

    delete pLayerIterator;
    pLayerTable->close();// закрыть таблицу блоков!
     ads_regen();
    return true;
}
void M_Legend_Shaper::SetStyle(CString Name){
    AcDbTextStyleTable* TextStyleTable;
    ACHAR* pStyleName;
    if(!(Acad::ErrorStatus::eOk==acdbCurDwg()->getTextStyleTable(TextStyleTable,AcDb::kForRead))){
           acutPrintf(_T("Не удалось открыть таблицу стилей"));
            return;
    }
    AcDbTextStyleTableRecord* TextStyleTableRecord;
    Acad::ErrorStatus Status;
    AcDbTextStyleTableIterator* Iter;
    TextStyleTable->newIterator(Iter);
    for (   ; !Iter->done(); Iter->step() ) 
    {
        // чтение данных очередного блока
        Status=Iter->getRecord(TextStyleTableRecord, AcDb::kForWrite);
        if(!(Acad::ErrorStatus::eOk==Status)){
            acutPrintf(_T("Не удалось открыть стиль Standard"));
            return;
        }
        // извлечение имени слоя
        
        TextStyleTableRecord->getName(pStyleName);
        
        CString Temp(pStyleName);
        if(Temp==Name){
          double tempScale;
          tempScale=TextStyleTableRecord->xScale();
              if(!((tempScale>0.74)&&(tempScale<0.76))){
                  TextStyleTableRecord->setXScale(0.75);
              }
          IdStyle=TextStyleTableRecord->objectId();
          acutPrintf(Name.GetBuffer());
        }
        TextStyleTableRecord->close();
    }
    delete Iter;
    TextStyleTable->close();
}
void M_Legend_Shaper::EnableLayer(AcDbLayerTableRecord * pLayerTableRecord){
}

M_Legend_Shaper::ShaperError M_Legend_Shaper::CreateBelowLine(){
      
      AcDbLine* BelowLine=new  AcDbLine(Convert_adstoAcGe(InvestigateLeaderEndPoint),Convert_adstoAcGe(InvestigateLineEndPoint));
      BelowLine->setLayer(Layer.GetBuffer());
      pRecord->appendAcDbEntity(BelowLine->objectId(),BelowLine);
      BelowLine->close();
      return M_Legend_Shaper::ShaperError::isAllowably;
}
CString GetHeightVariable(CString Name)
{
  struct resbuf *rb = NULL;
  CString Variable=L"";

  if (acedGetSym(Name.GetBuffer(), &rb) == RTNORM) {
    if (rb) {
      switch (rb->restype) {
          case RTREAL  :
              Variable.Format(L"%.1f",rb->resval.rreal);
              break;
        default:
            Variable=L"";
          break;
      }
    } else {
      acutPrintf(_T("\nВысота == NULL"));
      Variable=L"";
    }
  } else {
     acutPrintf(_T("\nОшибка при чтении информации для чтения высоты"));
     Variable=L"";
  }
  return Variable;
}

bool M_Legend_Shaper::GetHeight(double& Height){
    CString TempHeight;
    TempHeight=GetHeightVariable(L"Tehscale");
    if(TempHeight==L""){
        return false;
    }
     Height=_wtof(TempHeight.GetBuffer());
        Height=0.15*Height;
    return true;
}
Header file :

class M_Legend_Shaper
{
public:
    M_Legend_Shaper(M_Legend::MultilevelText& LegendText);
    enum ShaperError{
        isNotOpen=80220,
        isError=80379,
        isAllowably=80228
    };
    enum ViewText{
         AboveText=255,
         BelowText=257,
         LineText=251
    };
    
    /*!Метод для осуществления выбора слоя на который будет передан мультитекст
     */
     bool SetLayer(CString Name);
    /*!Метод для отображения надписи в виде мультитекста 
      @param LegendText Надпись в виде текста
    */
    ShaperError CreateMText();
    /*!Метод для отображения выноски
    */
    ShaperError CreateLeader();
    /*!Метод для отображения черты для мультитекста
    */
    ShaperError CreateBelowLine();
    /*!Метод для конвертации ads_point в AcGePoint3d
    */
    AcGePoint3d Convert_adstoAcGe(ads_point& Point);
    /*!Предварительный просмотр текста перед вставкой в чертёж
     */
     bool PreliminaryViewingText();
     M_Legend_Shaper::ShaperError GetPointAnd2DPolyline();
     
public:
    ~M_Legend_Shaper(void);
private:
    /*!Вид размещения текста
    */
    ViewText TextFlag;
    /*!Контур
    */
    AcDbEntity *Contour;
    /*!Мультитекст
    */
     AcDbMText* MText;
    /*!Высота
    */
     double Height;
     /*!Слой
    */
     CString Layer;
     /*!Указатель на таблицу блоков
     */
    AcDbBlockTable* pBlockTbl;
    /*!Указатель на запись таблицы блоков
     */
    AcDbBlockTableRecord *pRecord;
    /*!метод для открытия БД текущего рисунка и получения указателя на таблицу блоков
     *кроме того он задаёт указатель на пространтсво модели как блока  ACDB_MODEL_SPACE
    */
    ShaperError SetPointers();
    /*!Метод для преобразования MultilevelText в текст для передачи в MText
    */
    CString ConvertMultilevelText(M_Legend::MultilevelText& LegendText);
     AcDbMText::AttachmentPoint Attachment;
     /*!Начальная точка
     */
     ads_point BeginningPoint;
     /*!Точка вставки мультитекста
     */
     ads_point InvestigatePoint;
     /*!Вторая точка для выноски первая точка линии, над которой устанавливается мультитекст
     */
      ads_point InvestigateLeaderEndPoint;
     /*!Вторая точка линии, над которой устанавливается мультитекст
     */
      ads_point InvestigateLineEndPoint;
     /*!Правая нижняя точка Мультитекста
     */
     ads_point BelowRightPoint;
     /*!Угол поворота мультитекста
     */
     double Angle;
     /*!Id выбранного стиля для мультитекста
     */
     AcDbObjectId IdStyle;
     /*!Метод для осуществления выбора стиля для мультитекста
     */
     void SetStyle(CString Name);
     /*!Метод при необходимости разморозит разблокирует и отключит необходимый слой
     */
     void EnableLayer(AcDbLayerTableRecord * pLayerTableRecord);
     /*!Метод для осуществления выбора высоты текста
     */
     bool GetHeight(double& Height);
     bool The_point_is_established_at_preliminary_viewing;
     bool The_second_point_is_established;
  
     M_Legend::MultilevelText LegendText;
};

Re: Обновление размороженного мультитекста

В коде внимательно не разбирался, но первое на что обратил внимание - в SetPointers() ты блокируешь базу чертежа и сразу же ее разблокируешь по выходе из этого метода (это делает деструктор AcAxDocLock)
В конструкторе pRecord= new AcDbBlockTableRecord(); но дальше ты его не используешь, а используешь полученный из SetPointers() - утечка памяти.

Re: Обновление размороженного мультитекста

Хм ... Думал что метод getAt будет пользоваться выделенной памятью в куче,
а не выделять новую ...

Внёс корректировки ...

Но все равно отображение мультитекста после размораживания слоя не происходит ...

Кстати отображение отключённого мультитекста после включения нового происходит совершенно нормально
после регенерации ... проблемы только именно с размораживанием ...

Текст класса ... :

Source file :

void ads_regen();

M_Legend_Shaper::M_Legend_Shaper(M_Legend::MultilevelText& LegendText)
{
    this->LegendText=LegendText;
     pBlockTbl=NULL;
     MText=new AcDbMText();
     Contour=new AcDb2dPolyline();
     Angle=0;
     pRecord= NULL;
     Attachment =AcDbMText::AttachmentPoint::kBottomLeft;
     //Contour=new AcDbEntity();
     if(!GetHeight(Height)){
         Height=10;
     }
     Layer=_T("0");
     // Открываем БД текущего рисунка и получаем указатель на таблицу блоков
    // Получаем указатель на пространство модели как блок ACDB_MODEL_SPACE
    // открываем его для записи
    if(SetPointers()!=isAllowably){
        AfxMessageBox(_T("Возникли проблемы при открытии БД текущего рисунка или не получен один из важных указателей"));
    }
    SetStyle(L"Standard");
    
    CString TempText=ConvertMultilevelText(LegendText);
    The_second_point_is_established=false;
    The_point_is_established_at_preliminary_viewing=false;
}
M_Legend_Shaper::ShaperError M_Legend_Shaper::GetPointAnd2DPolyline(){
     AcDbObjectId objIdContour;
     ads_name entres;
       if( acedEntSel(_T("\n"),entres,BeginningPoint)!=RTNORM){
            acutPrintf(_T("Контур не выбран\n"));
            return isError;
       }
       else {
       }
       acdbGetObjectId(objIdContour,entres);
       if(Acad::eOk != acdbOpenObject(Contour,objIdContour,AcDb::kForRead)){
             acutPrintf(_T("Не открыт логически целостный элемент области\n"));
             return isError;
       }
       if (Contour->isA()!=AcDb2dPolyline::desc()){
           acutPrintf(_T("Выбранный объект не является 2d полилинией"));
           return isError;
       }
       return isAllowably;
}

M_Legend_Shaper::ShaperError M_Legend_Shaper::CreateLeader(){
    if(The_point_is_established_at_preliminary_viewing==false){
    if(The_second_point_is_established)
        return M_Legend_Shaper::ShaperError::isError;
    if (acedGetPoint(BeginningPoint, _T("\nУкажите положение текста технологической надписи:\n "), InvestigatePoint) != RTNORM){
              acutPrintf(_T("Точка не ввелась ... \n"));
       }
    The_second_point_is_established=true;
    }
    AcDbLeader* Leader=new AcDbLeader();
    Leader->appendVertex(Convert_adstoAcGe(BeginningPoint));
    Leader->appendVertex(Convert_adstoAcGe(InvestigateLeaderEndPoint));    
    Leader->enableArrowHead();
    Leader->setLayer(Layer.GetBuffer());
    if ((pRecord->appendAcDbEntity(Leader))!=Acad::eOk){
        acutPrintf(_T("\nОшибка добавления к БД мультитекста"));
        return isError;
    }
    Leader->close();
    return M_Legend_Shaper::ShaperError::isAllowably;
}

AcGePoint3d M_Legend_Shaper::Convert_adstoAcGe(ads_point& Point){
    AcGePoint3d AcGePoint3dPoint;
    CString m_strXPt;
    CString m_strYPt;
    CString m_strZPt;

        m_strXPt.Format(_T("%g"), Point[X]);
        m_strYPt.Format(_T("%g"), Point[Y]);
        m_strZPt.Format(_T("%g"), Point[Z]);

    acdbDisToF(m_strXPt, -1, &Point[X]);
    acdbDisToF(m_strYPt, -1, &Point[Y]);
    acdbDisToF(m_strZPt, -1, &Point[Z]);

    AcGePoint3dPoint.x=_tstof(m_strXPt.GetBuffer());
    AcGePoint3dPoint.y=_tstof(m_strYPt.GetBuffer());
    AcGePoint3dPoint.z=_tstof(m_strZPt.GetBuffer());

    return AcGePoint3dPoint;
}
M_Legend_Shaper::ShaperError M_Legend_Shaper::SetPointers(){
    dblock =new AcAxDocLock(acdbCurDwg());
             if(dblock->lockStatus() != Acad::eOk) {
                 acutPrintf(_T("\nНе удалось заблокировать базу"));
                 return isNotOpen;
              }

       if(acdbCurDwg()->getBlockTable(pBlockTbl, AcDb::kForRead)!=Acad::eOk){
            acutPrintf(_T("\nНе удалось получить блок"));
          
            return isNotOpen;
        }
        if(pBlockTbl->getAt(ACDB_MODEL_SPACE, pRecord, AcDb::kForWrite)){
            acutPrintf (_T("\nНет доступа к блоку *Model_Space. ")) ;
           
            return isNotOpen;
        }
        return isAllowably;
}

CString M_Legend_Shaper::ConvertMultilevelText(M_Legend::MultilevelText& LegendText){
    CString Text=L"";
    if(LegendText.AboveText!=L""){
          TextFlag=ViewText::AboveText;
    }
    else {
        if(LegendText.BelowText!=L""){
          TextFlag=ViewText::BelowText;
        }
        else {
          TextFlag=ViewText::LineText;
        }
    }
    if((LegendText.AboveText!=L""||LegendText.BelowText!=L"")&&LegendText.ReverseText!=L""){
        Text=L"\\A1;{\\H0.7x;\\S"+LegendText.AboveText+L"/"+LegendText.BelowText+L";}"+LegendText.ReverseText;
        return Text;
    }
    if((LegendText.AboveText!=L""||LegendText.BelowText!=L"")&&LegendText.FrontText!=L""){
        Text=L"\\A1;"+LegendText.FrontText+L"{\\H0.7x;\\S"+LegendText.AboveText+L"/"+LegendText.BelowText+L";}";
       
        return Text;
    }
    if((LegendText.AboveText==L""&&LegendText.BelowText==L"")&&LegendText.FrontText!=L""){
        Text=LegendText.FrontText;
        return Text;
    }
    if((LegendText.AboveText==L""&&LegendText.BelowText==L"")&&LegendText.ReverseText!=L""){
        Text=LegendText.ReverseText;
        return Text;
    }
    return Text;
}
bool M_Legend_Shaper::PreliminaryViewingText(){
    The_point_is_established_at_preliminary_viewing=true;
     struct resbuf rbFrom, rbTo;
      rbFrom.restype = RTSHORT;
    rbFrom.resval.rint = 1;
    rbTo.restype = RTSHORT;
    rbTo.resval.rint = 0;

    MLegendJig *pLegendJig
        = new MLegendJig(Convert_adstoAcGe(BeginningPoint),Convert_adstoAcGe(InvestigatePoint),Contour,TextFlag);
    pLegendJig->SetTextContent(ConvertMultilevelText(LegendText));
    pLegendJig->SetTextStyle(IdStyle);
    pLegendJig->SetTextHeight(Height);
    pLegendJig->SetTextAttachment(Attachment);

     pLegendJig->doIt();
    
     if(pLegendJig->inContour()==true){
       InvestigatePoint[0]=pLegendJig->GetSelectedMTextPoint().x;
       InvestigatePoint[1]=pLegendJig->GetSelectedMTextPoint().y;
       InvestigatePoint[2]=pLegendJig->GetSelectedMTextPoint().z;

       InvestigateLeaderEndPoint[0]=pLegendJig->GetSelectedLeaderEndPoint().x;
       InvestigateLeaderEndPoint[1]=pLegendJig->GetSelectedLeaderEndPoint().y;
       InvestigateLeaderEndPoint[2]=pLegendJig->GetSelectedLeaderEndPoint().z;

       InvestigateLineEndPoint[0]=pLegendJig->GetSelectedLineEndPoint().x;
       InvestigateLineEndPoint[1]=pLegendJig->GetSelectedLineEndPoint().y;
       InvestigateLineEndPoint[2]=pLegendJig->GetSelectedLineEndPoint().z;

       this->Angle=pLegendJig->GetSelectedAngle();
     }
    delete pLegendJig;
    return pLegendJig->inContour();
}

M_Legend_Shaper::ShaperError M_Legend_Shaper::CreateMText(){
    if(The_point_is_established_at_preliminary_viewing==false){

    if(The_second_point_is_established!=true){
           if (acedGetPoint(BeginningPoint, _T("\nУкажите положение текста технологической надписи:\n "), InvestigatePoint) != RTNORM){
              acutPrintf(_T("Точка не ввелась ... \n"));
              return isError;
           }
    }
    }
    AcGePoint3d TemporaryPoint=Convert_adstoAcGe(InvestigatePoint);

    Acad::ErrorStatus LgndErrorStatus;
        CString TempText=ConvertMultilevelText(LegendText);
        MText->setContents(TempText.GetBuffer());
        
        MText->setTextStyle(IdStyle);
        pRecord->appendAcDbEntity(MText->objectId(),MText);

        LgndErrorStatus=MText->setTextHeight(Height);
        LgndErrorStatus=MText->setAttachment(Attachment);

        LgndErrorStatus=MText->setLocation(TemporaryPoint);
        MText->setRotation(Angle);

        LgndErrorStatus=MText->setLayer(Layer.GetBuffer());
        
    return M_Legend_Shaper::ShaperError::isAllowably;
    
}

M_Legend_Shaper::~M_Legend_Shaper(void)
{
    delete dblock;
    Contour->close();
    MText->close();
    pRecord->close();
    pBlockTbl->close();
    
}
bool M_Legend_Shaper::SetLayer(CString Name){
    Acad::ErrorStatus Status;
    AcDbLayerTable * pLayerTable = NULL;
    ACHAR* pLayerName;
    Status=acdbCurDwg()->getLayerTable(pLayerTable, AcDb::kForWrite);
    if(Status!=Acad::ErrorStatus::eOk){
        acutPrintf(_T("Не удалось открыть таблицу слоёв"));
            return true;
        }
    AcDbLayerTableIterator * pLayerIterator = NULL;
    pLayerTable->newIterator(pLayerIterator);
    AcDbLayerTableRecord *pLayerTableRecord;
    bool flag=false;
    for (   ; !pLayerIterator->done(); pLayerIterator->step() ) 
    {
        
        // чтение данных очередного блока
        Status=pLayerIterator->getRecord(pLayerTableRecord, AcDb::kForWrite);
        if(Status!=Acad::ErrorStatus::eOk){
            acutPrintf(_T("Не удалось открыть запись из таблицы слоёв"));
            return true;
        }
        
        pLayerTableRecord->getName(pLayerName);
        CString Temp(pLayerName);
        
        if(Temp==Name){
            CString Temp;
            Temp=_T("\nНайден слой ")+Name;
                acutPrintf(Temp.GetBuffer());
                Layer=Name;
                flag=true;
                if(pLayerTableRecord->isFrozen()==true){
                    Status=pLayerTableRecord->setIsFrozen(false);
                    if(Status!=Acad::ErrorStatus::eOk){
                     acutPrintf(_T("\nНе удалось разморозить слой"));
                        return false;
                    } 
                       acutPrintf(_T("\nСлой разморожен"));               
                }    
                if(pLayerTableRecord->isOff()==true){
                    pLayerTableRecord->setIsOff(false);
                    acutPrintf(_T("\nСлой включен"));    
                }
                if(pLayerTableRecord->isLocked()==true){
                    pLayerTableRecord->setIsLocked(false);
                    acutPrintf(_T("\nСлой разблокирован"));    
                }
                pLayerTableRecord->close();
                break;    
        }
        pLayerTableRecord->close();// закрыть запись!
    }
    if(!flag){
        pLayerTableRecord=new AcDbLayerTableRecord();
          pLayerTableRecord->setName((ACHAR*)(Name.GetBuffer()));
          pLayerTable->add(pLayerTableRecord);
          Layer=Name;
          pLayerTableRecord->close();
    }

    delete pLayerIterator;
    pLayerTable->close();// закрыть таблицу блоков!
     ads_regen();
    return true;
}
void M_Legend_Shaper::SetStyle(CString Name){
    AcDbTextStyleTable* TextStyleTable;
    ACHAR* pStyleName;
    if(!(Acad::ErrorStatus::eOk==acdbCurDwg()->getTextStyleTable(TextStyleTable,AcDb::kForRead))){
           acutPrintf(_T("Не удалось открыть таблицу стилей"));
            return;
    }
    AcDbTextStyleTableRecord* TextStyleTableRecord;
    Acad::ErrorStatus Status;
    AcDbTextStyleTableIterator* Iter;
    TextStyleTable->newIterator(Iter);
    for (   ; !Iter->done(); Iter->step() ) 
    {
        // чтение данных очередного блока
        Status=Iter->getRecord(TextStyleTableRecord, AcDb::kForWrite);
        if(!(Acad::ErrorStatus::eOk==Status)){
            acutPrintf(_T("Не удалось открыть стиль Standard"));
            return;
        }
        // извлечение имени слоя
        
        TextStyleTableRecord->getName(pStyleName);
        
        CString Temp(pStyleName);
        if(Temp==Name){
          double tempScale;
          tempScale=TextStyleTableRecord->xScale();
              if(!((tempScale>0.74)&&(tempScale<0.76))){
                  TextStyleTableRecord->setXScale(0.75);
              }
          IdStyle=TextStyleTableRecord->objectId();
          acutPrintf(Name.GetBuffer());
        }
        TextStyleTableRecord->close();
    }
    delete Iter;
    TextStyleTable->close();
}
void M_Legend_Shaper::EnableLayer(AcDbLayerTableRecord * pLayerTableRecord){
}

M_Legend_Shaper::ShaperError M_Legend_Shaper::CreateBelowLine(){
      
      AcDbLine* BelowLine=new  AcDbLine(Convert_adstoAcGe(InvestigateLeaderEndPoint),Convert_adstoAcGe(InvestigateLineEndPoint));
      BelowLine->setLayer(Layer.GetBuffer());
      pRecord->appendAcDbEntity(BelowLine->objectId(),BelowLine);
      BelowLine->close();
      return M_Legend_Shaper::ShaperError::isAllowably;
}
CString GetHeightVariable(CString Name)
{
  struct resbuf *rb = NULL;
  CString Variable=L"";

  if (acedGetSym(Name.GetBuffer(), &rb) == RTNORM) {
    if (rb) {
      switch (rb->restype) {
          case RTREAL  :
              Variable.Format(L"%.1f",rb->resval.rreal);
              break;
        default:
            Variable=L"";
          break;
      }
    } else {
      acutPrintf(_T("\nВысота == NULL"));
      Variable=L"";
    }
  } else {
     acutPrintf(_T("\nОшибка при чтении информации для чтения высоты"));
     Variable=L"";
  }
  return Variable;
}
bool M_Legend_Shaper::GetHeight(double& Height){
    CString TempHeight;
    TempHeight=GetHeightVariable(L"Tehscale");
    if(TempHeight==L""){
        return false;
    }
     Height=_wtof(TempHeight.GetBuffer());
        Height=0.15*Height;
    return true;
}

Header file :

class M_Legend_Shaper
{
public:
    M_Legend_Shaper(M_Legend::MultilevelText& LegendText);
    enum ShaperError{
        isNotOpen=80220,
        isError=80379,
        isAllowably=80228
    };
    enum ViewText{
         AboveText=255,
         BelowText=257,
         LineText=251
    };
    
    /*!Метод для осуществления выбора слоя на который будет передан мультитекст
     */
     bool SetLayer(CString Name);
    /*!Метод для отображения надписи в виде мультитекста 
      @param LegendText Надпись в виде текста
    */
    ShaperError CreateMText();
    /*!Метод для отображения выноски
    */
    ShaperError CreateLeader();
    /*!Метод для отображения черты для мультитекста
    */
    ShaperError CreateBelowLine();
    /*!Метод для конвертации ads_point в AcGePoint3d
    */
    AcGePoint3d Convert_adstoAcGe(ads_point& Point);
    /*!Предварительный просмотр текста перед вставкой в чертёж
     */
     bool PreliminaryViewingText();
     M_Legend_Shaper::ShaperError GetPointAnd2DPolyline();
     
public:
    ~M_Legend_Shaper(void);
private:
    /*!Вид размещения текста
    */
    ViewText TextFlag;
    /*!Контур
    */
    AcDbEntity *Contour;
    /*!Мультитекст
    */
     AcDbMText* MText;
    /*!Высота
    */
     double Height;
     /*!Слой
    */
     CString Layer;
     /*!Указатель на таблицу блоков
     */
    AcDbBlockTable* pBlockTbl;
    /*!Указатель на запись таблицы блоков
     */
    AcDbBlockTableRecord *pRecord;
    /*!метод для открытия БД текущего рисунка и получения указателя на таблицу блоков
     *кроме того он задаёт указатель на пространтсво модели как блока  ACDB_MODEL_SPACE
    */
    ShaperError SetPointers();
    /*!Метод для преобразования MultilevelText в текст для передачи в MText
    */
    CString ConvertMultilevelText(M_Legend::MultilevelText& LegendText);
     AcDbMText::AttachmentPoint Attachment;
     /*!Начальная точка
     */
     ads_point BeginningPoint;
     /*!Точка вставки мультитекста
     */
     ads_point InvestigatePoint;
     /*!Вторая точка для выноски первая точка линии, над которой устанавливается мультитекст
     */
      ads_point InvestigateLeaderEndPoint;
     /*!Вторая точка линии, над которой устанавливается мультитекст
     */
      ads_point InvestigateLineEndPoint;
     /*!Правая нижняя точка Мультитекста
     */
     ads_point BelowRightPoint;
     AcAxDocLock *dblock;
     /*!Угол поворота мультитекста
     */
     double Angle;
     /*!Id выбранного стиля для мультитекста
     */
     AcDbObjectId IdStyle;
     /*!Метод для осуществления выбора стиля для мультитекста
     */
     void SetStyle(CString Name);
     /*!Метод при необходимости разморозит разблокирует и отключит необходимый слой
     */
     void EnableLayer(AcDbLayerTableRecord * pLayerTableRecord);
     /*!Метод для осуществления выбора высоты текста
     */
     bool GetHeight(double& Height);
     bool The_point_is_established_at_preliminary_viewing;
     bool The_second_point_is_established;
  
     M_Legend::MultilevelText LegendText;
};