ObjectARX, AutoCAD. Среда программирования библиотеки C++

         

Добавьте Код к Обработчикам


Как только Вы добавили обработчики, Вы готовы добавить код, чтобы иметь дело с вашим диалогом. Этот раздел суммирует то, что каждый обработчик делает с законченной распечаткой.

1 Сначала мы добавляем несколько сервисных функций, чтобы конвертировать{*преобразовывать*}, отображать, и проверить правильность значений.

Примечание мы использует CACUINUMERIC и средство управления CACUIANGLEEDIT, чтобы делать это:

// Utility functions

void AsdkAcUiDialogSample::DisplayPoint()

{

m_ctrlXPtEdit.SetWindowText(m_strXPt);

m_ctrlXPtEdit.Convert();

m_ctrlYPtEdit.SetWindowText(m_strYPt);

m_ctrlYPtEdit.Convert();

m_ctrlZPtEdit.SetWindowText(m_strZPt);

m_ctrlZPtEdit.Convert();

}

bool AsdkAcUiDialogSample::ValidatePoint()

{

if (!m_ctrlXPtEdit.Validate())



return false;

if (!m_ctrlYPtEdit.Validate())

return false;

if (!m_ctrlZPtEdit.Validate())

return false;

return true;

}

void AsdkAcUiDialogSample::DisplayAngle()

{

m_ctrlAngleEdit.SetWindowText(m_strAngle);

m_ctrlAngleEdit.Convert();

}

bool AsdkAcUiDialogSample::ValidateAngle()

{

if (!m_ctrlAngleEdit.Validate())

return false;

return true;

}

2 Теперь добавляют некоторые сервисные функции, чтобы выполнить итерации более чем двух таблиц идентификаторов и отображать названия{*имена*} в двух различных списках:

void AsdkAcUiDialogSample::DisplayBlocks()

{

AcDbBlockTable *pBlockTable;

acdbHostApplicationServices()->workingDatabase()

->getSymbolTable(pBlockTable, AcDb::kForRead);

// Iterate through the block table and display

// the names in the list box.

//

char *pName;

AcDbBlockTableIterator *pBTItr;

if (pBlockTable->newIterator(pBTItr) == Acad::eOk) {

while (!pBTItr->done()) {

AcDbBlockTableRecord *pRecord;

if (pBTItr->getRecord(pRecord, AcDb::kForRead)

== Acad::eOk) {

pRecord->getName(pName);

m_ctrlBlockListBox.InsertString(-1, pName);

pRecord->close();

}

pBTItr->step();

}

}

pBlockTable->close();

}

void AsdkAcUiDialogSample::DisplayRegApps()


{

AcDbRegAppTable *pRegAppTable;

acdbHostApplicationServices()->workingDatabase()

->getSymbolTable(pRegAppTable, AcDb::kForRead);

// Iterate through the reg app table and display the

// names in the list box.

//

char *pName;

AcDbRegAppTableIterator *pItr;

if (pRegAppTable->newIterator(pItr) == Acad::eOk) {

while (!pItr->done()) {

AcDbRegAppTableRecord *pRecord;

if (pItr->getRecord(pRecord, AcDb::kForRead)

== Acad::eOk) {

pRecord->getName(pName);

m_ctrlRegAppComboBox.InsertString(-1, pName);

pRecord->close();

}

pItr->step();

}

}

pRegAppTable->close();

}

3 Добавляют объявления для функций и переменных к определению класса файл заголовка:

void DisplayPoint();

bool ValidatePoint();

void DisplayAngle();

bool ValidateAngle();

void DisplayBlocks();

void DisplayRegApps();

CString m_strAngle;

CString m_strXPt;

CString m_strYPt;

CString m_strZPt;

4 Затем - обработчики кнопки для выбора точки и угла, используя редактора AutoCAD. Обратите внимание, как BeginEditorCommand (), CompleteEditorCommand (), и CancelEditorCommand () функции используются, чтобы скрыть диалог, позволять запрос к acedGetPoint и acedGetAngle, и наконец или отменять или восстанавливать изображение диалога, основанного на как выбранный пользователь:

// AsdkAcUiDialogSample обработчики сообщения

void AsdkAcUiDialogSample::OnButtonPoint()

{

// Hide the dialog and give control to the editor

//

BeginEditorCommand();

ads_point pt;

// Get a point

//

if (acedGetPoint(NULL, "\nPick a point: ", pt) == RTNORM) {

// If the point is good, continue

//

CompleteEditorCommand();

m_strXPt.Format("%g", pt[X]);

m_strYPt.Format("%g", pt[Y]);

m_strZPt.Format("%g", pt[Z]);

DisplayPoint();

} else {

// otherwise cancel the command (including the dialog)

CancelEditorCommand();

}

}

void AsdkAcUiDialogSample::OnButtonAngle()

{

// Hide the dialog and give control to the editor



//

BeginEditorCommand();

// Set up the default point for picking an angle

// based on the m_strXPt, m_strYPt, and m_strZPt values

//

ads_point pt;

acdbDisToF(m_strXPt, -1, &pt[X]);

acdbDisToF(m_strYPt, -1, &pt[Y]);

acdbDisToF(m_strZPt, -1, &pt[Z]);

double angle;

// Get a point from the user

//

if (acedGetAngle(pt, "\nPick an angle: ", &angle) == RTNORM) {

// If we got an angle, go back to the dialog

//

CompleteEditorCommand();

// Convert the acquired radian value to degrees since the

// AcUi control can convert that to the other formats.

//

m_strAngle.Format("%g", angle*(180.0/PI));

DisplayAngle();

} else {

// otherwise cancel the command (including the dialog)

//

CancelEditorCommand();

}

}

5 Теперь обработчики окна редактирования осуществлены. В основном мы только хотим конвертировать{*преобразовать*} значения к текущим параметрам настройки Модулей:

void AsdkAcUiDialogSample::OnKillfocusEditAngle()

{

// Get and update text the user typed in.

//

m_ctrlAngleEdit.Convert();

m_ctrlAngleEdit.GetWindowText(m_strAngle);

}

void AsdkAcUiDialogSample::OnKillfocusEditXpt()

{

// Get and update text the user typed in.

//

m_ctrlXPtEdit.Convert();

m_ctrlXPtEdit.GetWindowText(m_strXPt);

}

void AsdkAcUiDialogSample::OnKillfocusEditYpt()

{

// Get and update text the user typed in.

//

m_ctrlYPtEdit.Convert();

m_ctrlYPtEdit.GetWindowText(m_strYPt);

}

void AsdkAcUiDialogSample::OnKillfocusEditZpt()

{

// Get and update text the user typed in.

//

m_ctrlZPtEdit.Convert();

m_ctrlZPtEdit.GetWindowText(m_strZPt);

}

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

void AsdkAcUiDialogSample::OnKillfocusComboRegapps()

{

CString strFromEdit;

m_ctrlRegAppComboBox.GetWindowText(strFromEdit);



if (m_ctrlRegAppComboBox.FindString(-1, strFromEdit) == CB_ERR)

if (acdbRegApp(strFromEdit) == RTNORM)

m_ctrlRegAppComboBox.AddString(strFromEdit);

}

7, чтобы делать некоторую проверку правильности данных, мы обрабатываем это в OnOk () обработчик. Это, конечно, может быть сделано в любое время. Также обратите внимание, что OnOk () обработчик сохраняет данные в параметр пользователя (системный реестр), используя SetDialogData () функция:

void AsdkAcUiDialogSample::OnOK()

{

if (!ValidatePoint()) {

AfxMessageBox("Sorry, Point out of desired range.");

m_ctrlXPtEdit.SetFocus();

return;

}

if (!ValidateAngle()) {

AfxMessageBox("Sorry, Angle out of desired range.”);

m_ctrlAngleEdit.SetFocus();

return;

}

// Store the data into the registry

//

SetDialogData("ANGLE", m_strAngle);

SetDialogData("POINTX", m_strXPt);

SetDialogData("POINTY", m_strYPt);

SetDialogData("POINTZ", m_strZPt);

CAcUiDialog::OnOK();

}

8 Наконец, OnInitDialog () функция заботится о всей инициализации, включая изменение размеров и требования постоянства данных:

BOOL AsdkAcUiDialogSample::OnInitDialog()

{

// Set the dialog name for registry lookup and storage

//

SetDialogName("AsdkAcUiSample:AsdkAcUiDialog");

CAcUiDialog::OnInitDialog();

DLGCTLINFOdlgSizeInfo[]= {

{ IDC_STATIC_GROUP1, ELASTICX, 20 },

{ IDC_STATIC_GROUP1, ELASTICY, 100 },

{ IDC_EDIT_XPT,ELASTICX, 20 },

{ IDC_EDIT_YPT,ELASTICX, 20 },

{ IDC_EDIT_ZPT,ELASTICX, 20 },

{ IDC_EDIT_ANGLE, ELASTICX, 20 },

{ IDC_STATIC_GROUP2, MOVEX, 20 },

{ IDC_STATIC_GROUP2, ELASTICY, 100 },

{ IDC_STATIC_GROUP2, ELASTICX, 80 },

{ IDC_LIST_BLOCKS, MOVEX, 20 },

{ IDC_LIST_BLOCKS, ELASTICY, 100 },

{ IDC_STATIC_TEXT2,MOVEX, 20 },

{ IDC_STATIC_TEXT2,MOVEY, 100 },

{ IDC_LIST_BLOCKS, ELASTICX, 80 },

{ IDC_STATIC_TEXT2,ELASTICX, 80 },

{ IDC_STATIC_GROUP3, MOVEY, 100 },

{ IDC_STATIC_GROUP3, ELASTICX, 20 },

{ IDC_COMBO_REGAPPS, MOVEY, 100 },



{ IDC_COMBO_REGAPPS, ELASTICX, 20 },

{ IDC_STATIC_TEXT3,MOVEY, 100 },

{ IDC_STATIC_TEXT3,ELASTICX, 20 },

{ IDOK,MOVEX, 100 },

{ IDCANCEL, MOVEX, 100 },

};

const DWORD numberofentries =

sizeof dlgSizeInfo / sizeof DLGCTLINFO;

SetControlProperty(dlgSizeInfo, numberofentries);

// Must be within a 100-unit cube centered about 0,0,0.

//

m_ctrlXPtEdit.SetRange(-50.0, 50.0);

m_ctrlYPtEdit.SetRange(-50.0, 50.0);

m_ctrlZPtEdit.SetRange(-50.0, 50.0);

// Must be between 0 and 90 degrees.

//

m_ctrlAngleEdit.SetRange(0.0, 90.0 /*(PI/2.0)*/);

// Assign a title for the dialog.

//

SetWindowText("AcUiDialog Sample");

// Load the default bitmaps.

//

m_ctrlPickButton.AutoLoad();

m_ctrlAngleButton.AutoLoad();

// Get and display the preserved data from the registry.

//

if (!GetDialogData("ANGLE", m_strAngle))

m_strAngle = "0.0";

if (!GetDialogData("POINTX", m_strXPt))

m_strXPt = "0.0";

if (!GetDialogData("POINTY", m_strYPt))

m_strYPt = "0.0";

if (!GetDialogData("POINTZ", m_strZPt))

m_strZPt = "0.0";

DisplayPoint();

DisplayAngle();

DisplayBlocks();

DisplayRegApps();

return TRUE; // return TRUE unless you set the focus to a control

}


Содержание раздела