ObjectARX_acedGrRead/acedDragGen動態拖動

acedGrRead函數的定義形式爲:  函數

int acedGrRead(int track,int * type,struct resbuf * result);

第一個參數:track:控制位;第二個參數:type:返回輸入設備及其種類;第三個參數:result:從用戶得到命令行

返回拖動的座標:track爲Bit 0(1):當用戶移動鼠標或其它頂點設備時, type 設置爲 5,result 設置爲(X,Y)座標。3d

返回全部的關鍵值:track爲Bit 1(2) :包括函數和光標的全部代碼。指針

控制光標的顯示:Bit 2(4) :type爲0,顯示通常的十字絲;type爲1,不顯示光標或十字絲;type爲2,顯示選擇實體的小方框。code

不顯示錯誤:Bit 3 (8) :當用戶按下 Ctrl+C 快捷鍵的時候,控制檯暫停消息。orm

具體用法如例:對象

int track = 1, type; // 控制位和輸入設備類型
struct resbuf result;  // 保存鼠標拖動時的動態座標
while (track > 0)
{
acedGrRead(track, &type, &result); // 追蹤光標移動
ptText[X] = result.resval.rpoint[X];  // 得到用戶輸入點的位置
ptText[Y] = result.resval.rpoint[Y];
// 使用得到的座標
{
……
}
if (type == 3)  // 若是用戶按下了鼠標左鍵,跳出循環
{
track = 0;
}
}

用戶選擇一個實體,獲取其屬性,建立文本標註,當用戶在圖形窗口中移動鼠標時,修改標註文本的位置get

void ZffCHAP2AddDimension()
{
// 提示用戶選擇圓弧
ads_name en;
ads_point pt;
if (acedEntSel("選擇所要標註的圓弧:", en, pt) != RTNORM)
  return;

// 得到選擇對象的指針
AcDbObjectId arcId;
Acad::ErrorStatus es = acdbGetObjectId(arcId, en);
if (es != Acad::eOk)
   return;

AcDbEntity *pEnt = NULL;
es = acdbOpenAcDbEntity(pEnt, arcId, AcDb::kForRead);

// 判斷選擇的對象是不是圓弧
if (!pEnt->isKindOf(AcDbArc::desc()))
{
pEnt->close();
return;
}

AcDbArc *pArc = AcDbArc::cast(pEnt);

// 得到圓弧的特徵點位置
AcGePoint3d ptCenter, ptStart, ptEnd, ptMiddle;
ptCenter = pArc->center();
es = pArc->getStartPoint(ptStart);
es = pArc->getEndPoint(ptEnd);
double length = 0.0;
es = pArc->getDistAtPoint(ptEnd, length);//得到曲線上某一點到起點的距離
es = pArc->getPointAtDist(length / 2, ptMiddle);//距離起點必定長度的點
pEnt->close();

// 建立三點角度標註
CString strLength;
strLength.Format("%.2f", length);
AcDbObjectId dimId;
dimId = CCreateEnt::CreateDim3PtAngular(ptCenter, ptStart,ptEnd, ptMiddle, strLength);

// 拖動鼠標改變標註文字的位置
AcGePoint3d ptText;
int track = 1, type; //track=1
struct resbuf result;  // 保存鼠標拖動時的動態座標
while (track > 0)
{
acedGrRead(track, &type, &result); // 追蹤光標移動
ptText[X] = result.resval.rpoint[X];
ptText[Y] = result.resval.rpoint[Y];

// 設置拖動位置爲標註文本的插入點
acdbOpenAcDbEntity(pEnt, dimId, AcDb::kForWrite);
if (pEnt->isKindOf(AcDb3PointAngularDimension::desc()))
{
AcDb3PointAngularDimension *pDim = NULl;
pDim = AcDb3PointAngularDimension::cast(pEnt);
if (pDim != NULL)
{
pDim->setTextPosition(ptText);
}
}
pEnt->close();
if (type == 3)  // 若是用戶按下了鼠標左鍵
{
track = 0;
}
} 
}

根據用戶的選擇移動文字回調函數

void ZffCHAP2MoveText()
{
ads_name entName;
ads_point ptPick, ptBase;
if (acedEntSel("\n選擇所要移動的文字:", entName, ptPick) != RTNORM)
   return;

AcDbObjectId txtId;
AcDbText *pText = NULL;
AcDbEntity *pEnt = NULL;
Acad::ErrorStatus es = acdbGetObjectId(txtId, entName);
if (es != Acad::eOk)
    return;

AcGePoint3d ptInsertOld(0, 0, 0);
acdbOpenObject(pEnt, txtId, AcDb::kForWrite);
if (pEnt->isKindOf(AcDbText::desc()))
{
pText = AcDbText::cast(pEnt);
if (pText != NULL)
{
ptInsertOld = pText->position();
} 
}
pEnt->close();

if (acedGetPoint(NULL, "\n選擇基點:", ptBase) != RTNORM)
    return;

acedPrompt("\n選擇第二點:");
AcGePoint3d ptInsertNew(0, 0, 0);
AcGePoint3d ptPick3d = asPnt3d(ptBase);

// 鼠標拖動部分
int track = 1, type; //track=1
struct resbuf result;  // 保存鼠標拖動時的動態座標
while (track > 0)
{
acedGrRead(track, &type, &result); // 追蹤光標移動
ptInsertNew[X] = result.resval.rpoint[X] - ptPick3d[X] + ptInsertOld[X];
ptInsertNew[Y] = result.resval.rpoint[Y] - ptPick3d[Y] + ptInsertOld[Y];

// 設置拖動位置爲直線的終點座標
acdbOpenObject(pEnt, txtId, AcDb::kForWrite);
if (pEnt->isKindOf(AcDbText::desc()))
{
pText = AcDbText::cast(pEnt);
if (pText != NULL)
{
pText->setPosition(ptInsertNew);
}
}
pEnt->close();
if (type == 3)  // 若是用戶按下了鼠標左鍵
{
track = 0;
}
} 
}

 acedDragGen函數的定義形式爲:it

int acedDragGen (const ads_name selectName, const ACHAR *pmt, int cursor, int (*scnf) (ads_point pt, ads_matrix mt), ads_point point)

第一個參數:selectName:選擇集名稱;第二個參數:pmt:命令行提示語句;第三個參數:cursor:0;第四個參數:int (*scnf) (ads_point pt, ads_matrix mt):回調函數;第五個參數:point:當前鼠標位置的點

具體用法如例:

//加到選擇集
    ads_name selectName,singleName;
	bool bIsFirst = true;
	for (int i = 0;i < arrAllEntId.length(); ++i)
	{
		acdbGetAdsName(singleName, arrAllEntId[i] );

		if( bIsFirst )
		{
			acedSSAdd( singleName, NULL, selectName );
			bIsFirst = false;
		}
		else
			acedSSAdd( singleName, selectName, selectName );

		acedSSFree( singleName );
	}    

	// 用戶拖動肯定位置
	ads_point point;
	while(1)
	{
		int rc = acedDragGen(selectName,_T("\n左鍵肯定位置:"),0,JigCallBack,point);
		if (rc != RTNORM)
		{
			acedSSFree(selectName);
			acutPrintf(_T("\n插入已取消!\n"));
			return FALSE;
		}

		AcGeMatrix3d matrix;
		AcGePoint3d ptBase(point[X], point[Y], point[Z]);//基點
		matrix(2,3) = 0; // Z方向不動
		AcDbObjectIdArray arrNEntId;
		CDrawEntityBlock mQkqly(NULL,ptBase);
		HHVerify(mQkqly.LockDoc());
		mQkqly.CopyEntitys(arrAllEntId, matrix, arrNEntId);//從原點拷貝一份到點擊點

		//打成塊		
		AcDbObjectId blockId;
		mQkqly.GetBlockRefrenceId(blockId);
		mQkqly.UnLockDoc();
		if (blockId.isNull() || !blockId.isValid())
			return FALSE;
	}
	acedSSFree(selectName);

回調函數:

__declspec(dllexport) int JigCallBack(ads_point pt,ads_matrix matrix)
{
	// 肯定最終位置
	AcGeVector3d vector(pt[X]-origin[X],pt[Y]-origin[Y],0); // z方向不動
	AcGeMatrix3d mat = mat.setToTranslation(vector);

	for(int i = 0; i < 4; i++)
	{
		for(int j = 0; j < 4; j++) 
		{
			matrix[i][j] = mat(i,j); 
		} 
	}

	return RTNORM;
}
相關文章
相關標籤/搜索