- 积分
- 31205
- 明经币
- 个
- 注册时间
- 2004-10-17
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2025-5-17 18:27:52
|
显示全部楼层
本帖最后由 cable2004 于 2025-5-17 19:12 编辑
 - class CMoveJig : public AcEdJig {
- public:
- CMoveJig() : mBasePoint(), mCurrentPoint(), mOffset() {}
- AcEdJig::DragStatus Start(const AcDbObjectIdArray& objIds, const AcGePoint3d& basePoint) {
- mObjIds = objIds;
- mBasePoint = basePoint;
- mCurrentPoint = basePoint;
- mOffset.set(0.0, 0.0, 0.0);
- if (!PrepareDisplayEntities()) {
- return kCancel;
- }
- setDispPrompt(_T("\n指定目标点: "));
- setSpecialCursorType(AcEdJig::kCrosshair);
- DragStatus stat = drag();
- if (stat == kNormal) {
- MoveOriginalEntities();
- }
- CleanupDisplayEntities();
- return stat;
- }
- protected:
- virtual DragStatus sampler() {
- AcGePoint3d newPt;
- DragStatus stat = acquirePoint(newPt, mBasePoint);
- if (stat == kNormal && !newPt.isEqualTo(mCurrentPoint)) {
- mCurrentPoint = newPt;
- mOffset = mCurrentPoint - mBasePoint;
- return kNormal;
- }
- return stat;
- }
- virtual Adesk::Boolean update() {
- AcGeMatrix3d xform;
- xform.setToTranslation(mOffset); // 创建平移矩阵
- for (int i = 0; i < mDisplayEntities.length(); ++i) {
- if (mDisplayEntities) {
- mDisplayEntities->transformBy(xform);
- }
- }
- acedRedraw(NULL, 1);
- return Adesk::kTrue;
- }
- // 返回第一个实体作为主实体
- virtual AcDbEntity* entity() const override {
- return mDisplayEntities.isEmpty() ? NULL : mDisplayEntities[0];
- }
- // 添加额外方法获取所有实体
- const AcArray<AcDbEntity*>& entities() const {
- return mDisplayEntities;
- }
- virtual Adesk::Boolean worldDraw(AcGiWorldDraw* pWorldDraw) {
- for (int i = 0; i < mDisplayEntities.length(); ++i) {
- if (mDisplayEntities) {
- mDisplayEntities->worldDraw(pWorldDraw);
- if (mDisplayEntities != NULL)
- {
- pWorldDraw->geometry().draw(mDisplayEntities);
- }
- }
- }
- return Adesk::kTrue;
- }
- private:
- AcDbObjectIdArray mObjIds;
- AcGePoint3d mBasePoint;
- AcGePoint3d mCurrentPoint;
- AcGeVector3d mOffset;
- AcArray<AcDbEntity*> mDisplayEntities;
- bool PrepareDisplayEntities() {
- for (int i = 0; i < mObjIds.length(); ++i) {
- AcDbEntity* pEnt = NULL;
- if (acdbOpenObject(pEnt, mObjIds, AcDb::kForRead) == Acad::eOk) {
- AcDbEntity* pClone = static_cast<AcDbEntity*>(pEnt->clone());
- if (pClone) {
- mDisplayEntities.append(pClone);
- }
- pEnt->close();
- }
- }
- return mDisplayEntities.length() > 0;
- }
- void CleanupDisplayEntities() {
- for (int i = 0; i < mDisplayEntities.length(); ++i) {
- if (mDisplayEntities) {
- delete mDisplayEntities;
- }
- }
- mDisplayEntities.removeAll();
- }
- void MoveOriginalEntities() {
- AcGeMatrix3d xform;
- xform.setToTranslation(mOffset); // 创建平移矩阵
- for (int i = 0; i < mObjIds.length(); ++i) {
- AcDbEntity* pEnt = NULL;
- if (acdbOpenObject(pEnt, mObjIds, AcDb::kForWrite) == Acad::eOk) {
- pEnt->transformBy(xform);
- pEnt->close();
- }
- }
- }
-
- };
-
- // 移动选中对象命令入口函数
- static void Cmd_MoveSelected() {
- ads_name ss;
- if (RTNORM != acedSSGet(NULL, NULL, NULL, NULL, ss)) {
- acutPrintf(_T("\n未选择对象"));
- return;
- }
- AcDbObjectIdArray objIds;
- Adesk::Int32 length = 0;
- acedSSLength(ss, &length);
- for (long i = 0; i < length; ++i) {
- ads_name ent;
- acedSSName(ss, i, ent);
- AcDbObjectId id;
- acdbGetObjectId(id, ent);
- objIds.append(id);
- }
- acedSSFree(ss);
- ads_point pt;
- if (RTNORM != acedGetPoint(NULL, _T("\n指定基点: "), pt)) {
- return;
- }
- acdbUcs2Wcs(pt, pt, false);
- AcGePoint3d basePt = asPnt3d(pt);
- CMoveJig jig;
- jig.Start(objIds, basePt);
- }
-
-
模仿一个move移动的功能,为什么不能时时看到移动的过程,最终结果是对的。
|
|