Chương này sẽ trình bày cách để dẫn xuất một lớp mới từ AcDbObject. Nó sẽ cung cấp thông tin chi tiết trong việc filer, bốn kiểu của tham chiếu đối tượng (sở hữu cứng và mềm, con trỏ cứng và con trỏ mềm), và quá trình Undo và redo. Ngoài ra chương này còn thảo luận về cơ cấu cho verioning đối tượng.
Điều kiện là bạn đã làm quen với tài liệu được nó đến trong chương 5, Đối tượng cơ sở dữ liệu và chương 12, Dẫn xuất một đối tượng ObjectARX mới.
Một lớp mới phải ghi đè lên các hàm sau:
Các đề tài trong chuyên mục:
- Ghi đè các hàm ảo AcDbObject
- Thực thi hàm thành viên
- Lưu trữ đối tượng vào tệp tin DWG và DXF
- Tham chiếu đối tượng
- Tham chiếu sở hũu
- Tham chiếu con trỏ
- Vấn đề giao dịch dài cho đối tượng mới
- Làm sạch Purge
- Undo và Redo
- subErase, subOpen, subClose, và subCancel
- Ví dụ một lớp đối tượng mới
- Hỗ trợ phiên bản đối tượng
Ghi đè (overridding) các hàm ảo AcDbObject
Nếu sử dụng một lớp dẫn xuất từ AcDbObject, sẽ có rất nhiều các hàm ảo mà bạn phải ghi đè lên như đề cập trong chuyên mục sau. Chuyên mục này sẽ trình bày các hàm thường xuyên được sử dụng và những hàm ít khi dùng đến.
AcDbObject: Hàm quan trọng để ovenridden
Một lớp mới bắt buộc phải ghi đè lên các hàm sau:
virtual Acad::ErrorStatus
dwgInFields(AcDbDwgFiler* filer);
virtual Acad::ErrorStatus
dwgOutFields(AcDbDwgFiler* filer) const;
virtual Acad::ErrorStatus
dxfInFields(AcDbDxfFiler* filer);
virtual Acad::ErrorStatus
dxfOutFields(AcDbDxfFiler* filer) const;(~AcDbObject)
AcDbObject: Các hàm thường được overridden
Một lớp mới thường ghi đè các hàm sau:
virtual Acad::ErrorStatus
audit(AcDbAuditInfo* pAuditInfo);
// Commonly useful, as this happens at a point where a new
// object state is being committed.
//
virtual Acad::ErrorStatus subClose();
// The next two functions apply to container objects.
//
virtual Acad::ErrorStatus
deepClone(AcDbObject* pOwnerObject,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary = true) const;
virtual Acad::ErrorStatus
wblockClone(AcRxObject* pOwnerObject,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary = true) const;
AcDbObject: Hàm thỉnh thoảng được Overridden
Lớp mới thỉnh thoảng ghi đè lên các hàm sau:
virtual Acad::ErrorStatus
subErase(Adesk::Boolean erasing);
virtual Acad::ErrorStatus
subHandOverTo(AcDbObject* newObject);
virtual Acad::ErrorStatus
subOpen(AcDb::OpenMode mode);
virtual Acad::ErrorStatus
subCancel();
virtual Acad::ErrorStatus
subSwapIdWith(AcDbObjectId otherId,
Adesk::Boolean swapXdata = false,
Adesk::Boolean swapExtDict = false);
AcDbObject: Hàm hiếm khi được Overridden
Lớp mới hiếm khi ghi đè các hàm sau:
virtual Acad::ErrorStatus
setOwnerId(AcDbObjectId objId);
virtual resbuf*
xData(const char* regappName = NULL) const;
virtual Acad::ErrorStatus
setXData(const resbuf* xdata);
virtual void
addPersistentReactor(AcDbObjectId objId);
virtual Acad::ErrorStatus
removePersistentReactor(AcDbObjectId objId);
virtual void
cancelled(const AcDbObject* dbObj);
virtual void
copied(const AcDbObject* dbObj,
const AcDbObject* newObj);
virtual void
erased(const AcDbObject* dbObj,
Adesk::Boolean pErasing = true);
virtual void
goodbye(const AcDbObject* dbObj);
virtual void
openedForModify(const AcDbObject* dbObj);
virtual void
modified(const AcDbObject* dbObj);
virtual void
modifyUndone(const AcDbObject* dbObj);
virtual void
modifiedXData(const AcDbObject* dbObj);
virtual void
unappended(const AcDbObject* dbObj);
virtual void
objectClosed(const AcDbObjectId objId);
virtual void
modifiedGraphics(const AcDbEntity* dbEnt);
AcRxObject: Functions Rarely Overridden
Lớp mới hiếm khi sử dụng các hàm sau:
virtual AcRxObject*
clone() const;
virtual Acad::ErrorStatus
copyFrom(const AcRxObject* pSrc);
// Do not override; AcDbObject behavior is already accounted for.
//
virtual HRESULT __stdcall
QueryInterface ( REFIID riid,
void ** ppvObject );
virtual ULONG __stdcall
AddRef();
virtual ULONG __stdcall
Release();
AcDbEntity: Hàm để ghi đè (Override)
Nếu thực thi một thực thể mới, xem chương 14, Dẫn xuất từ AcDbEntity, để xem danh sách các hàm để override.
AcDbCurve: Các hàm để Override
virtual Adesk::Boolean
isClosed() const;
virtual Adesk::Boolean
isPeriodic() const;
virtual Adesk::Boolean
isPlanar() const;
virtual Acad::ErrorStatus
getPlane(AcGePlane&, AcDb::Planarity&) const;
virtual Acad::ErrorStatus
getStartParam(double&) const;
virtual Acad::ErrorStatus
getEndParam(double&) const;
virtual Acad::ErrorStatus
getStartPoint(AcGePoint3d&) const;
virtual Acad::ErrorStatus
getEndPoint(AcGePoint3d&) const;
virtual Acad::ErrorStatus
getPointAtParam(double, AcGePoint3d&) const;
virtual Acad::ErrorStatus
getParamAtPoint(const AcGePoint3d&, double&)const;
virtual Acad::ErrorStatus
getDistAtParam(double param, double& dist) const;
virtual Acad::ErrorStatus
getParamAtDist(double dist, double& param) const;
virtual Acad::ErrorStatus
getDistAtPoint(const AcGePoint3d&, double&) const;
virtual Acad::ErrorStatus
getPointAtDist(double, AcGePoint3d&) const;
virtual Acad::ErrorStatus
getFirstDeriv(
double param,
AcGeVector3d& firstDeriv) const;
virtual Acad::ErrorStatus
getFirstDeriv(
const AcGePoint3d&,
AcGeVector3d& firstDeriv) const;
virtual Acad::ErrorStatus
getSecondDeriv(
double param,
AcGeVector3d& secDeriv) const;
virtual Acad::ErrorStatus
getSecondDeriv(
const AcGePoint3d&,
AcGeVector3d& secDeriv) const;
virtual Acad::ErrorStatus
getClosestPointTo(
const AcGePoint3d& givenPnt,
AcGePoint3d& pointOnCurve,
Adesk::Boolean extend = Adesk::kFalse) const;
virtual Acad::ErrorStatus
getClosestPointTo(
const AcGePoint3d& givenPnt,
const AcGeVector3d& normal,
AcGePoint3d& pointOnCurve,
Adesk::Boolean extend = Adesk::kFalse) const;
virtual Acad::ErrorStatus
getOrthoProjectedCurve(
const AcGePlane&,
AcDbCurve*& projCrv) const;
virtual Acad::ErrorStatus
getProjectedCurve(
const AcGePlane&,
const AcGeVector3d& projDir,
AcDbCurve*& projCrv) const;
virtual Acad::ErrorStatus
getOffsetCurves(
double offsetDist,
AcDbVoidPtrArray& offsetCurves) const;
virtual Acad::ErrorStatus
getSpline(AcDbSpline*& spline) const;
virtual Acad::ErrorStatus
getSplitCurves(
const AcGeDoubleArray& params,
AcDbVoidPtrArray& curveSegments) const;
virtual Acad::ErrorStatus
getSplitCurves(
const AcGePoint3dArray& points,
AcDbVoidPtrArray& curveSegments) const;
virtual Acad::ErrorStatus
extend(double newParam);
virtual Acad::ErrorStatus
extend(
Adesk::Boolean extendStart,
const AcGePoint3d& toPoint);
virtual Acad::ErrorStatus
getArea(double&) const;
Implementing Member Functions
Khi định nghĩa một hàm thành viên mới hoặ cghi đè lên hàm cũ, đầu tiên cần phải gọi tới hàm assertReadEnabled(), assertWriteEnabled(), hoặc assertNotifyEnabled() để chắc chắn rằng đối tượng đang được mở ở trạng thái thích hợp. Trong 3 hàm này, assertWriteEnabled() là tối quan trọng. Bạn có thể sử dụng nó để điều khiển UNDO ghi chép lại sự thay đổi xảy ra trong các hàm thành viên. (Tìm hiểu thêm Undo và Redo.) Thậm chí bạn không cần phải ghi chép để UNDO, nhưng vẫn nhất thiết phải gọi đến hàm:
assertWriteEnabled(kFalse, kFalse);
Lời gọi hàm này đánh dấu đối tượng chưa được lưu lại. Nếu không theo chỉ dẫn này, có thể dẫn đến kết quả hư hỏng bản vẽ.
Bảng sau đây trình bày 3 trạng thái có thể xảy ra cho quá trình mở đối tượng (đọc, ghi và ghi chú) và chỉ ra hàm xác nhận assert nào thành công cho mỗi trạng thái. Nếu đối tượng không được mở đúng trạng thái cho hàm xác nhận, thì hàm sẽ không trả về. AutoCAD® thoát ra và người dùng đuọc nhắc về việc có lưu bản vẽ lại hay không.