1、ObjectARX Training华中科技大学CAD中心武汉天喻软件有限责任公司2010年2月Object ARX1ObjectARX应用的介绍 ObjectARX是一个仅在AutoCAD上进行二次开发的一套开发环境,通俗点讲就是一系列的API ObjectARX的应用举例:扩展AutoCAD功能 为各种工程设计开发便利的工具Object ARX2ObjectARX概述 ARXAutoCAD Runtime eXtension DBX DataBase eXtension ARX=.DLL+2 exported functions acrxEntryPoint&acrxGetApiVersi
2、on AutoCAD.EXEARX AppsARX AppsObjectARX APIsObject ARX3ObjectARX开发特点 不同的ACAD版本用不同的开发包及开发环境 ACAD2000ACAD2002:VC+6.0 ACAD2004ACAD2006:VS.NET 2002 ACAD2007ACAD2009:VS.NET 2005 ACAD2010 :VS.NET 2008 ACAD2007开始字符串采用UNICODE编码 ARX之间不能连续依赖 A.arx依赖B.arx,B.arx依赖C.dbx,则A.arx不能加载 与ACAD已有功能地位一致Object ARX4ObjectA
3、RX类库构成 AcRx:用于帮定一个应用程序以及运行类的注册和识别。AcEd:用于注册自定义命令和AutoCAD事件通告。AcDb:AutoCAD图形数据库。AcGi:用于AutoCAD 的图形类。AcGe:用于AutoCAD 的线型和几何对象通用类。ADS:AutoCAD 的早期版本C语言函数库。Object ARX5ObjectARX类结构 类图classmap.dwg 位置:ObjectARX 2006classmapObject ARX6用ObjectARX能做些什么?访问、编辑和扩展AutoCAD图形数据库 和AutoCAD系统相互通信 使用MFC创建用户接口 支持多文档应用 创建自
4、定义类和自定义实体 可以开发复杂的应用 和其他开发环境进行协作Object ARX7培训安排-1 一、基础 AUTOCAD数据库结构及操作,ads_name-句柄-ID及转换,aced常用函数,WCS/UCS及转换,菜单/工具条/对话框制作 二、自定义对象 显示/存储/夹点/移动/拷贝/范围/list/捕捉点/炸开/相交点/sub事件 三、自定义对象生成与编缉 双击修改/Jig/属性页Object ARX8培训安排-2 四、一些重要对象 字典/层/线型/字体样式 五、扩展数据 六、反应器 八、总结Object ARX9所需基础 ACAD基本操作 C+VC MFC(界面)COM(属性页等)STL
5、(提高效率)Object ARX10AutoCAD图形数据库概述 AutoCAD图形实际上是一系列存放在一个AcDbDatabase类型的对象中的AcDb对象。一个dwg就是一个数据库 具备数据库的基本组织结构。包括九个符号表和一个命名对象词典Object ARX11AutoCAD图形数据库结构AcDbDatabase数据库|-AcDb符号表|-块表(AcDbBlockTable)|-尺寸标注样式表(AcDbDimStyleTable)|-层表(AcDbLayerTable)|-线型表(AcDbLinetypeTable)|-已注册应用程序表(AcDbRegAppTable)|-字体样式表(A
6、cDbTextStyleTable)|-用户坐标系表(AcDbUCSTable)|-视口表(AcDbViewportTable)|-视图表(AcDbViewTable)|-命名对象词典访问:AcDbDatabase:getSymbolTableObject ARX12向数据库中添加实体Acad:ErrorStatus addEntityToModelSpace(AcDbEntity*pEnt,AcDbObjectId&EntId)Acad:ErrorStatus eRet;AcDbDatabase*pDb=acdbHostApplicationServices()-workingDatabas
7、e();AcDbBlockTable*pBlockTable;eRet=pDb-getBlockTable(pBlockTable,AcDb:kForRead);if(eRet!=Acad:eOk)return eRet;AcDbBlockTableRecord*pBlockTableRecord;eRet=pBlockTable-getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb:kForWrite);if(eRet!=Acad:eOk)pBlockTable-close();return eRet;pBlockTable-close();eRet=p
8、BlockTableRecord-appendAcDbEntity(EntId,pEnt);if(eRet!=Acad:eOk)pBlockTableRecord-close();return eRet;pBlockTableRecord-close();return Acad:eOk;Object ARX13怎样遍历AutoCAD图形数据库?void FindObjectId(AcDbObjectId&objId)AcDbDatabase*pDb=acdbHostApplicationServices()-workingDatabase();AcDbBlockTable*pBlockTabl
9、e;pDb-getBlockTable(pBlockTable,AcDb:kForRead);AcDbBlockTableRecord*pBlockTableRecord;pBlockTable-getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb:kForRead);pBlockTable-close();AcDbBlockTableRecordIterator*pIter;pBlockTableRecord-newIterator(pIter);/Create an iteratorfor(pIter-start();!pIter-done();pIt
10、er-step().AcDbEntity*pEntity;if(pIter-getEntity(pEntity,AcDb:kForRead)!=Acad:eOk)continue;If(pEntity-isKindOf(AcDbCircle:desc()objId=pEntity-ObjectId();pBlockTableRecord-close();Object ARX14怎样创建和使用已有的AutoCAD图形数据库?要使用AcDbDatabase数据库,与使用其它数据库一样,首先要声明一个数据库对象。AcDbDatabase类的声明,调用类的构造函数:AcDbDatabase:AcDbD
11、atabase(bool buildDefaultDrawing=true,bool noDocument=false);其中,buildDefaultDrawing参数控制是否创建一个包括所有默认数据记录的数据库。该参数的默认值为该参数的默认值为true,这样在AcDbDatabase数据库创建时,将在新建的数据库中包含一个AutoCAD图形数据库必须包含的基本数据要素,这些要素包括九个符号表及其初始记录(比如0层、STANDARD文字样式等),命名对象词典(组词典和多线样式词典)以及必要的系统变量设置。这样就可以向新建的数据库中添加各种实体和对象。如:AcDbDatabase*pDb=ne
12、w AcDbDatabase(true);若指定该参数为若指定该参数为false,AutoCAD将创建一个完全空的AcDbDatabase数据库。这样的AcDbDatabase数据库不能直接向其中添加实体或对象,需读入一个图形文件来拓展该图形数据库,然后再逐步添加或修改数据库中的实体或对象。读入图形数据库使用函数:AcadErrorStatus AcDbDatabase:readDwgFile(const char*fileName);若要使用已有的图形,比如“test.dwg”文件,则使用下列代码:AcDbDatabase*pDb=new AcDbDatabase(false);pDb-re
13、adDwgFile(“test.dwg”);AcDbDatabase构造函数的noDocument参数控制打开的数据库是否与当前文档关联,此参数用于“多文档处理”中。注意:在这种情况下,AcDbdatabase()的参数必须指定为false(当然,0或者Adesk:kFalse都可以)。因为使用pDb-readDwgFile()函数时,pDb必须是一个完全空白的数据库,也就是说,哪怕使用了AcDbDatabase(false);新建数据库后,只要对数据库进行了操作,就不能再使用readDwgFile()函数,否则会导致严重的内存错误。Object ARX15数据库对象AcDbObject概述
14、每一个数据库对象具有以下三种表示方法:句柄AcDbHandle 对象idAcDbObjectId 指针AcDbObect*Object ARX16三者之间的相互关系 注意:Handle不变,ObjectId变化Object ARX17之间相互关系和转换1.AcDbHandle-AcDbObjectIdAcDbDatabase:getAcDbObjectId(&AcDbObjectId,FALSE,AcDbHandle);2.AcDbObjectId-AcDbHandleAcDbHandle =AcDbObjectId:handle();3.AcDbObjectId-AcDbObject*acd
15、bOpenObject(AcDbObject*&,AcDbObjectId,AcDb:OpenMode);4.AcDbObject*-AcDbHandle AcDbHandle =AcDbObject:getAcDbHandle();5.ads_name 和 AcDbObjcetId一个ads_name 是 一个包含两个long型元素的数组这个数组的第一个元素就是AcDbObjcetId6.ads_name 和 AcDbObjcetId相互转换acdbGetAdsName(ads_name,objId);acdbGetObjectId(objId,ads_name);Object ARX18怎
16、样访问数据库对象?打开对象的方法:acdbOpenObject()该函数为模板函数,能打开任意对象acdbOpenAcDbObject()acdbOpenAcDbEntity()打开对象的模式:AcDb:kForRead/只读AcDb:kForWrite/可写AcDb:kForNotify/通知升级和降级访问:AcDbObject:upgradeOpen();/升级为写AcDbObject:downgradeOpen();/降级为读删除对象AcDbObject:erase()Object ARX19用事务方式访问 事务 AcTransaction*AcTransactionManager:st
17、artTransaction AcTransactionManager:endTransaction()AcTransactionManager:abortTransaction(),virtual Acad:ErrorStatus getObject(AcDbObject*&obj,AcDbObjectId objectId,AcDb:OpenMode mode,bool openErasedObject=false)Object ARX20对象访问限制 如果一个对象被写打开,则在关闭前不能再被读打开或写打开 如果一个对象被读打开,则在关闭前不能再被写打开,但可被读打开(一个对象最多可同时被
18、打开128次)Object ARX21对象类型识别desc():a static member function that returns the class descriptor object of a particular(known)class.cast():a static member function that returns an object of the specified type,or NULL if the object is not of the required class(or a derived class).isKindOf():returns whether
19、 an object belongs to the specified class(or a derived class).isA():returns the class descriptor object of an object whose class is unknown.AcRxClass例如:AcDbEntity*curEntity=somehowGetAndOpenAnEntity();if(curEntity-isKindOf(AcDbEllipse:desc()If(curEntity-isA()=AcDbEllipse:desc()AcDbLine*pLine =AcDbLi
20、ne:cast(curEntity)Object ARX22AutoCAD里的交互AcEd 全局函数 String,number acquisitionacedGetInt used to get an integer valueacedGetReal used to get a real valueacedGetString used to get a stringacedGetDist used to get the distance between two points Point,angle acquisitionacedGetAngle used to get a angle val
21、ueacedGetPoint used to pick a pointacedGetCorner Entity selection acedEntSel used to select a single entityacedNEntSel used to select a single,nested entityacedNEntSelP used to select a single,nested entityacedSSGet used to select multiple entities Others acedGetKword used to get a key wordacedInitG
22、et used to initialize acedGetXXXX functionsacedGetFileD used to retrieve file selection from a file dialogObject ARX23向ACAD发送命令 acedCommand:立即执行 acedCommand(RTSTR,zoom,RTSTR,e,0);sendStringToExecute:作为下一个命令执行CString strCmd;strCmd.Format(_HNBMReservedAreaModified%d%d,(long)ReservedAreaHandle,nType);a
23、cDocManager-sendStringToExecute(acDocManager-curDocument(),strCmd,false,true,false);共同点:都不能执行有用户交互的命令Object ARX24WCS,UCS,OCS(ECS)规则:数据库中对象保存的点坐标是WCS坐标(建议);而一些acedXX函数(如acedGetPoint,acedEntSel等)、list命令一般是UCS坐标。WCS与UCS相互转换/UCS坐标系fromrb.restype=RTSHORT;fromrb.resval.rint=1;/WCS坐标系torb.restype=RTSHORT;t
24、orb.resval.rint=0;acedTrans(pt_ucs,&fromrb,&torb,FALSE,resultPt);acdbUcs2Wcs acdbWcs2Ucs AcDbEntity:getEcsObject ARX25UCS常用函数及类函数:Acad:ErrorStatus acedGetCurrentUCS(AcGeMatrix3d&mat);(以下函数和类可看作符号表的操作模式)函数:Acad:ErrorStatus getSymbolTable(AcDbUCSTable*&pTable,AcDb:OpenMode mode);类:AcDbUCSTable 类:AcDbU
25、CSTableRecord Object ARX26ARX应用向导 应用向导:ObjectARX 2006的在ObjectARX 2006utilsObjARXWiz目录下。功能:与MFC应用向导类似 产生工程 产生特定类及函数Object ARX27ARX,DBX加载/卸载 加载 ap(appload)arx 其它方式(lisp文件,注册表等)卸载 ap arxObject ARX28ARX软件结构 加载:On_kInitAppMsg 卸载:On_kUnloadAppMsg 命令映射(arx2006或以上):static void INTECAD_INTESelect(void)ACED_A
26、RXCOMMAND_ENTRY_AUTO(CINTECADApp,INTECAD,_INTESelect,INTESelect,ACRX_CMD_TRANSPARENT,NULL)Object ARX29ARX&MFCObjectARX 完全支持MFC。两个MFC基类 AdUi and AcUi。注意:在调用资源时加上这句话 CAcModuleResourceOverride resOverride;Object ARX30对话框资源转换,多个ARX时可能需要CAcModuleResourceOverride resOverride;或 AfxSetResourceHandle(_hdllIn
27、stance);AfxSetResourceHandle(acedGetAcadResourceInstance();Object ARX31菜单与工具条 通过菜单文件 COM方式添加Object ARX32例1:基本操作 建立应用程序 建立命令 实现功能:选中一实体,然后输出其信息Object ARX33例2:重复产生同半径的圆 对话框输入半径 用鼠标指定圆心Object ARX34数据库结构查看工具 ARXDBG工具的使用 位置:ObjectARX 2006samplesdatabaseARXDBG 文档:ArxDbg.docObject ARX35本节结束 下节将介绍自定义实体的内容Ob
28、ject ARX36自定义对象类 一般从 AcDbObject 或AcDbEntity派生 AcDbObject:不须显示,如字典对象 AcDbEntity:可显示/操作的实体 从其他(如AcDbLine等实体类)派生:根据需要 自定义类可继续从另一个自定义继承,从而继承体系成树状结构 编写时遵守一定的规则 放在DBX工程中Object ARX37自定义类特点 头文件 ACRX_DECLARE_MEMBERS ACDB_REGISTER_OBJECT_ENTRY_AUTO 版本 CPP文件 ACRX_DXF_DEFINE_MEMBERS AcDbProxyEntity:kNoOperation
29、 assertReadEnabled()与assertWriteEnabled();读写控制 显示刷新 UNO/REDOObject ARX38DBX加载/卸载 在ARX中调用 acrxLoadModule/acrxUnloadModule ARX在使用DBX的LIB库时,可能会出现诸如:acrxGetApiVersion找不到或ARX加载失败的问题.解决方法:在ARX和DBX工程中都增加def文件,文件内容如下:EXPORTSacrxEntryPointPRIVATEacrxGetApiVersion PRIVATEObject ARX39自定义对象-读入/写出 作用 文件(DWG,DXF)
30、读写 UNDO/REDO CLONE 函数 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;Object ARX40AcDbDwgFiler类中常用函数 virtual
31、 Acad:ErrorStatus readInt32(Adesk:Int32*)virtual Acad:ErrorStatus writeInt32(Adesk:Int32)virtual Acad:ErrorStatus readString(char*)virtual Acad:ErrorStatus writeString(const char*)virtual Acad:ErrorStatus readPoint3d(AcGePoint3d*)virtual Acad:ErrorStatus writePoint3d(const AcGePoint3d&)virtual Acad:
32、ErrorStatus readAcDbHandle(AcDbHandle*)virtual Acad:ErrorStatus writeAcDbHandle(const AcDbHandle&)virtual Acad:ErrorStatus readBytes(void*,Adesk:UInt32)virtual Acad:ErrorStatus writeBytes(const void*,Adesk:UInt32)读字符串char*str=NULL;pFiler-readString(&str);m_strPanelType=str;acutDelString(str);Object
33、ARX41自定义对象-显示函数:virtual Adesk:Boolean worldDraw(AcGiWorldDraw*mode);virtual void viewportDraw(AcGiViewportDraw*mode);区别 worldDraw函数用来生成跟视图无关的几何图形,它只生成一组几何图形,其他的因为视图的变化而导致的几何图形变化都由AutoCAD来自动调整,举个例子,你生成一个立方体,这个立方体从不同的角度看所看到的外形是不一样的,但是worldDraw只生成一个角度的几何图形,其他的都由AutoCAD来自动的调整了。viewportDraw则不同,它可以根据不同的视图
34、生成不同的几何图形,当你的视图改变的时候,它自动将几何图形调整到正确的状态。有时候这两个函数需要配合使用,例如,如果你画圆,那就可以用worldDraw,因为无论你怎么变换视图圆还是圆。但是如果你生成一些表示立体的几何图形有时候就需要借助于viewportDraw了,因为对于立体图形来说不同的视图看到的是不一样的。举个例子来说明其区别就是worldDraw画出来的立体图形,你改变了角度(也算viewport改变)后看到的有可能就不是立体图形了,但是你用viewportDraw画出来的就不会出现这样的问题。Object ARX42AcGiWorldDraw与AcGiViewportDraw 类似
35、,但AcGiViewportDraw有视口相关的矩阵和方向函数 通过geometry得到绘图类AcGiWorldGeometry 的对象 通过subEntityTraits得到环境设置类AcGiSubEntityTraits 对象Object ARX43AcGiWorldGeometry与AcGiGeometry circle circularArc Polyline(多段线)polygon text pline(多义线,类似于AcDbPolyline)Object ARX44AcGiSubEntityTraits 常用函数 virtual void setColor(const Adesk:
36、UInt16 color)=0;virtual void setTrueColor(const AcCmEntityColor&color)=0;virtual void setLayer(const AcDbObjectId layerId)=0;virtual void setLineType(const AcDbObjectId linetypeId)=0;virtual void setFillType(const AcGiFillType)=0;virtual void setLineWeight(const AcDb:LineWeight lw)=0;virtual void se
37、tLineTypeScale(double dScale=1.0)=0;注意 一个自定义对象的不同部分可分属不同层 是否填充只针对circle,polygon等封闭图形Object ARX45例1 自定义实体-读写/显示 生成一等边三角形的自定义实体 中心 外接圆半径 方位角Object ARX46自定义对象-夹点 virtual Acad:ErrorStatus getGripPoints(AcGePoint3dArray&gripPoints,AcDbIntArray&osnapModes,AcDbIntArray&geomIds)const;virtual Acad:ErrorStatu
38、s moveGripPointsAt(const AcDbIntArray&indices,const AcGeVector3d&offset);Object ARX47自定义对象-移动 virtual Acad:ErrorStatus transformBy(const AcGeMatrix3d&xform);Object ARX48自定义对象-拷贝 virtual Acad:ErrorStatus deepClone(AcDbObject*pOwnerObject,AcDbObject*&pClonedObject,AcDbIdMapping&idMap,Adesk:Boolean isP
39、rimary=true)const;virtual Acad:ErrorStatus wblockClone(AcRxObject*pOwnerObject,AcDbObject*&pClonedObject,AcDbIdMapping&idMap,Adesk:Boolean isPrimary=true)const;Object ARX49自定义对象-炸开 virtual Acad:ErrorStatus explode(AcDbVoidPtrArray&entitySet)const;Object ARX50自定义对象-捕捉点 virtual Acad:ErrorStatus getOsn
40、apPoints(AcDb:OsnapMode osnapMode,int gsSelectionMark,const AcGePoint3d&pickPoint,const AcGePoint3d&lastPoint,const AcGeMatrix3d&viewXform,AcGePoint3dArray&snapPoints,AcDbIntArray&geomIds)const;Object ARX51自定义对象-范围virtual Acad:ErrorStatus getGeomExtents(AcDbExtents&extents)const;Object ARX52自定义对象-li
41、st 作用:调试检查用.virtual void list()const;Object ARX53自定义对象-相交点 virtual Acad:ErrorStatus intersectWith(const AcDbEntity*pEnt,AcDb:Intersect intType,AcGePoint3dArray&points,int thisGsMarker=0,int otherGsMarker=0)const;Object ARX54自定义对象-sub事件virtual Acad:ErrorStatus subErase(Adesk:Boolean erasing);virtual
42、Acad:ErrorStatus subOpen(AcDb:OpenMode mode);virtual Acad:ErrorStatus subClose();Object ARX55理解拖动夹点与平移实体的工作方式 在拖动夹点时,ACAD调用自定义对象重载的moveGripPointsAt函数。但这时你要注意:此时的this指针指向的自定义对象A并非数据库中待修改的对象B,A只是ACAD复制的一个用于操作的临时对象,它的所有持久性(即保存到文件中的)参数与B相同,非持久性参数保持构造函数时的值。A并没有被加入到数据库中,所以在moveGripPointsAt不能通过database()函数
43、获取数据库指针;A中的参数没有累积性,即在moveGripPointsAt中更改了一个类成员变量m的值,下一次调用moveGripPointsAt时,m的值与B中m值相同,而不是修改过的值。transformBy与moveGripPointsAt类似。Object ARX56本节结束 下节将介绍自定义对象生成与编缉 双击修改 动态生成(Jig)属性页Object ARX57实体的双击修改在ARX工程中:从AcDbDoubleClickEdit派生并重载函数:virtual void startEdit(AcDbEntity*pEnt,AcGePoint3d pt);virtual void f
44、inishEdit(void);在On_kInitAppMsg中:if(!acrxDynamicLinker-loadModule(/*MSG0*/ACDBLCLKEDITPE.ARX,Adesk:kFalse)AfxMessageBox(ACDBLCLKEDITPE.ARX Load Failed);/Initialize Double Click EditingAcDbDoubleClickEdit:rxInit();acrxBuildClassHierarchy();TYTriangleDoubleClickEdit*pTriangleDoubleClickEdit=new TYTria
45、ngleDoubleClickEdit;TYTriangle:desc()-addX(AcDbDoubleClickEdit:desc(),pTriangleDoubleClickEdit);Object ARX58实体的双击修改 On_kUnloadAppMsg函数中:TYTriangle:desc()-delX(AcDbDoubleClickEdit:desc();startEdit函数 文档加锁 设置资源 显示对话框 修改实体 文档解锁Object ARX59例1:自定义实体的双击修改 可改:外接圆半径 填充Object ARX60动态创建 AcEdJig virtual DragSta
46、tus sampler();virtual Adesk:Boolean update();virtual AcDbEntity*entity()const;DragStatus drag();Object ARX61Object ARX62AcEdJIg中的用户输入函数 DragStatus acquireString(char*str);DragStatus acquireAngle(double&ang);DragStatus acquireAngle(double&ang,const AcGePoint3d&basePnt);DragStatus acquireDist(double&d
47、ist);DragStatus acquireDist(double&dist,const AcGePoint3d&basePnt);DragStatus acquirePoint(AcGePoint3d&);DragStatus acquirePoint(AcGePoint3d&,const AcGePoint3d&basePnt);注意:不能使用acedXXX函数Object ARX63AcEdJig:其它函数 const char*keywordList();void setKeywordList(const char*);const char*dispPrompt();void set
48、DispPrompt(const char*,.);AcEdJig:CursorType specialCursorType();void setSpecialCursorType(CursorType);AcEdJig:UserInputControls userInputControls();void setUserInputControls(AcEdJig:UserInputControls);Object ARX64例2:动态生成自定义实体 用向导生成或手工书写 向导生成的AcEdJig派生类有错:头文件中除去ACRX_DECLARE_MEMBERS CPP文件中除去ACRX_CONS
49、_DEFINE_MEMBERSObject ARX65练习 自定义实体 具有N条边的多边形 画出多边形及外接圆 可输入边数N和外接圆半径 动态创建 在创建过程中显示图形 在创建过程中显示并可修改尺寸(选作)双击修改Object ARX66属性页 优点:可批量修改多个实体的属性 操作步骤少 与ACAD的已有操作更加一致 缺点:实现有点复杂 用户操作习惯问题Object ARX67生成工程 标准ATL工程Object ARX68生成ATL类 派生 接口 IDL DBX中实体类中:头文件:static bool s_bHasClsid;static CLSID s_clsid;实现:initCLSI
50、D()getClassIDObject ARX69属性名称及分组 GetDisplayName GetCategoryName ShowPropertyObject ARX70预定义值 GetPredefinedStrings GetPredefinedValueObject ARX71显示对话框 MapPropertyToPage IOPMPropertyDialogObject ARX72字典 字典内可保存多个从AcDbObject派生的对象 可用于保存全局变量,选项设置Object ARX73AcDbDictionary*pNameDict;AcDbDictionary*pNameLis
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。