- UID
- 1
- 积分
- 15892
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-3
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
ObjectARX Technical Newsletter - December 1999
This document is part of ObjectARX Newsletter Archive
/Note: the URLs in this posting may be broken into several lines by the
transmission media. Please make sure that you have the full URL before
trying to access it./
/Note: Have you missed a Newsletter issue? Visit our Newsletter archive at
the following URL:/
http://adn.autodesk.com/techsupp/docs/newsletters.htm
Dear ObjectARX developer,
Table of Contents
=================
(1) ObjectARX reactors
1.1 Introduction
1.2 AcDbObjectReactor versus AcDbObject!
1.3 What is the best choice NOD or EXTD?
1.4 Derive from a class that supports filing protocol
1.5 One last item!
(2) Reactor classes
(3) Access for all ADN members to the ADT/OMF newsgroup
(4) New Solutions
(1) ObjectARX' reactors
=======================
1.1 Introduction
----------------
In AutoCAD there are two main type of reactors (transient and persistent).
Transient reactors are setup by your application to monitor the activity
in the AutoCAD environment while your application is loaded. This kind of
reactor *must* be detached from the subject (object the reactor is
attached to) it is monitoring when your application is unloaded. It is
important to do this because the AutoCAD subsystem will continue to notify
all reactors attached to a subject, even if the application hosting the
reactor code is not present anymore. Persistent reactors provide the same
kind of service as that of a transient reactor, however the only difference
between a persistent reactor and a transient reactor is that a persistent
reactor is database resident. As a result of the persistent reactor being
database resident, the application is not required to recreate and reattach
the persistent reactor types to their subjects, the next time your drawing
and application is loaded into AutoCAD.
1.2 AcDbObjectReactor versus AcDbObject!
----------------------------------------
It may come as a surprise that both AcDbObjectReactor and AcDbObject are
reactors and provide the same kinds of service to your application.
The difference is that a reactor derived from AcDbObject is
persistent and the reactor derived from AcDbObjectReacor is not.
Remember that AcDbObjectReactor is derived from AcRxObject and is
responsible for the RTTI protocol. AcRxObject does not contain filing
protocol. AcDbObject introduces the filing protocol and is also derived
from AcRxObject as a matter of fact.
Both implement the same notification callback methods (cancelled/copied/
erased/...) and can therefore be used to monitor an object in a DWG
database. However, the transient form of the reactor requires that the
application removes the reactor from the subject (object) when the
application hosting the reactor code is being unloaded, or when AutoCAD
exits. However the next time the drawing is loaded into AutoCAD, the
application will not be able to monitor the object again until the
reactors are attached to the objects once again as before. As a result this
operation requires that you to retrieve the object you want to monitor,
which can be slow and/or difficult. The solution in such a case is to use
the persistent form of the reactor. Then the reactor will be
permanently attached to it's subject and will be immediately active,
as long as the application hosting the reactor code is present. If the
application hosting the reactor code is not present, the next time the
object is loaded in AutoCAD, the reactor will be inactive but will remain
attached for later use, because of the persistent nature of the reactor.
Creating a transient reactor is simple, just derive from the reactor base
class and implement the callback method(s) you are interested in. Then
create an instance of the transient reactor and attach it to a subject
using 'addReactor()' to monitor the method(s) of the subject you have
chosen. Do not forgot to remove the transient reactor
(with 'removeReactor()') when you unload your application or AutoCAD
exits.
Creating a persistent reactor is a little more complicated. You are
required to derive from a class which supports filing protocol
(AcDbObject for example) and implement the callback method(s) you are
interested in. Also you need to implement filing methods so that
your persistent reactor can be saved into the DWG file. When you crate
a persistent reactor for the first time in our drawing, create an instance
of the reactor and provide it a valid owner and a valid subject. The
owner is the object which will make sure that the reactor will be saved
into the DWG file. This can be an entity's Extension Dictionary or the
Named Objects Dictionary. We only attach a reactor to a subject to
monitor the subject, however the subject being monitored does not own
the reactor. It is possible for the subject to be the owner reactor
(Extension Dictionary), but remember you still have to provide both
(subject and owner) in order to make everything work correctly.
Usually, a persistent reactor is derived from AcDbObject and the subject
will be an AcDbEntity object (or derived from AcDbEntity). It is very
important to note that an AcDbblockTableRecord cannot own an AcDbObject.
Therefore you will need to add the reactor into a dictionary. The
AutoCAD Named Objects Dictionary (NOD) or the entity's Extension
Dictionary (EXTD) are two suitable locations to append the reactor to.
1.3 What is the best choice NOD or EXTD?
----------------------------------------
It really is a matter of choice and the architecture you propose to use.
Using the EXTD will produce a bigger DWG file. Approximately, 250 bytes
for each EXTD + 250 bytes (minimum) for your reactor and for each entity
where you want a reactor to be attached to. Using the NOD will produce a
smaller DWG file, 250 bytes for the company dictionary in the NOD + 250
bytes (minimum) for your reactor for each entity. But, you have only one
company dictionary and you may share the same reactor instance for all
(or a group) of entities. Using the EXTD of an entity, sharing the same
reactor is not possible.
1.4 Derive from a class that supports filing protocol
-----------------------------------------------------
For persistent reactors, you will have to derive from a class which
supports filing protocol such as AcDbObject.
All objects which support filing protocol can be used as a reactor, so an
entity derived from AcDbLine can also be a reactor of any other object as
long as this object (the subject) is database resident. Usually, AcDbObject
is sufficient, but remember it is not a requirement. Take a look at
the solution sample:
SOLVING CUSTOM ENTITY AS A REACTOR PROBLEMS
/cgi-bin/solution.pl?SID=21858
1.5 One last item!
------------------
When the reactor callback method is being called, it is not always
possible to open the subject for write and modify operations. This is
because the subject is already opened with a 'kNotify' operation. However,
it is sometimes possible to reopen the object for a 'kWrite' operation
using AutoCAD's transaction mechanism. But be aware that it will once
again trigger a reactor call, and that you may create an infinite loop
as a result. Also the reactor may be called when all operations to be
processed have not yet proceeded (i.e. erased() being called when the
object has been erased, but modified() will be called as well just
after and then objectclosed()).
The best approach is to wait for another notification where you are sure
all operations have been completed and that you can safely open the
object again and modify it (AcEditorReactor::commandEnded() for example).
(2) Reactor classes
===================
AcRxObject
Transient Reactors
------------------
AcApDocManagerReactor
AcApLongTransactionReactor
AcDbDatabaseReactor
AcDbObjectReactor
AcDbEntityReactor
AcDbRasterImageDefFileAccessReactor
AcDbRasterImageDefTransReactor
AcEdInputContextReactor
AcEdInputPointMonitor
AcEdInputPointFilter
AcRxDLinkerReactor
AcRxEventReactor
AcEditorReactor
AcTransactionReactor
Persistent Reactors
-------------------
AcDbObject
AcDbEntity
AcDbCurve
AcDbLine
...
...
AcDbdictionary
...
...
(3) Access for all ADN members to the ADT/OMF newsgroup
We are pleased to announce access to the Architectural
Desktop/Land Development Desktop OMF (autodesk.adn.aec-dev)
newsgroup is now accessible to all ADN members, using the same
password and username as used to access the ObjectARX newsgroup.
The password and username can be found at the following URL:
http://adn.autodesk.com/techsupp/discussion/default.htm
The ADT/OMF newsgroup can be found at the following location:
news://adesknews.autodesk.com/autodesk.adn.aec-dev
We look forward to your participation in this newsgroup.
(4) New Solutions
=================
PREVENT ACAD FROM ENTERING ZERO DOC STATE
/cgi-bin/solution.pl?SID=46546
UNDOCUMENTED ADS_REGEN()
/cgi-bin/solution.pl?SID=45058
HOW TO MAKE A NON DATABASE RESIDENT COPY OF A COMPLEX OBJECT
/cgi-bin/solution.pl?SID=13718
HOW TO INSERT AN IMAGE FILE INTO ACAD USING ARX CODE
/cgi-bin/solution.pl?SID=16253
CLONE ON COMPLEX ENTITIES DOES NOT COPY XDATA AND PERSISTENT REACTORS
/cgi-bin/solution.pl?SID=44982
EXPLAIN ACGEVECTOR3D::ANGLETO()
/cgi-bin/solution.pl?SID=45178
HOW TO GET THE NAME OF A BLOCK USING ARX
/cgi-bin/solution.pl?SID=45944
WHEN TO LOCK A DOCUMENT
/cgi-bin/solution.pl?SID=45945
MAKING NON-DATABASE RESIDENT OBJECTS WORK WITH UNDO
/cgi-bin/solution.pl?SID=45066
DXF GROUP CODE 100 MEANING
/cgi-bin/solution.pl?SID=45287
HOW TO CLIP XREFS PROGRAMMETICALLY
/cgi-bin/solution.pl?SID=45413
FREEZELAYERSINVIEWPORT FAILS ON PAPERSPACE VIEWPORT
/cgi-bin/solution.pl?SID=45302
PLOT LOGGING API UTILITY
/cgi-bin/solution.pl?SID=45303
DISPLAY ATTRIBUTE DIALOG AFTER REALTIME ZOOM OR PAN
/cgi-bin/solution.pl?SID=45317
-----------------------------------------------------------------------------
To subscribe or unsubscribe, go to
http://adn.autodesk.com/techsupp/docs/newsletters.htm
-----------------------------------------------------------------------------
You received this message as a result of your registration
on the ADN List Server subscription page. If you no longer wish
to receive these messages, read the next section, How to use this
mailing list.
How to use this mailing list:
You may unsubscribe from this e-mail newsletter, or subscribe to
a variety of other informative e-mail newsletters, by returning
to the ADN List Server subscription page at
http://adn.autodesk.com/techsupp/docs/newsletters.htm
and changing your subscription preferences.
Alternatively, from the subscribed account you can send an e-mail to
<Majordomo-partnersys@autodesk.com> with the following command in the
body of your email message:
unsubscribe <list-name>
----------------------------------------------------------------------
Autodesk Developer Network (ADN) information and events:
For information on all ADN topics, please visit:
http://www.autodesk.com/adn
----------------------------------------------------------------------
THIS DOCUMENT IS PROVIDED FOR INFORMATIONAL PURPOSES ONLY. The
information contained in this document represents the current view of
Autodesk Inc. on the issues discussed as of the date of publication.
Because Autodesk must respond to change in market conditions, it
should not be interpreted to be a commitment on the part of Autodesk
and Autodesk cannot guarantee the accuracy of any information
presented after the date of publication.
INFORMATION PROVIDED IN THIS DOCUMENT IS PROVIDED 'AS IS' WITHOUT
WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND FREEDOM FROM INFRINGEMENT.
The user assumes the entire risk as to the accuracy and the use of
this document. This document may be copied and distributed subject to
the following conditions:
1. All text must be copied without modification and all pages must
be included
2. All copies must contain Autodesk's copyright notice and any other
notices provided therein
3. This document may not be distributed for profit
---------------------------------------------------------------------- |
|