• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            AUTOCAD二次開(kāi)發(fā)工具

                   ARX(AutoCAD Runtime eXtension實(shí)時(shí)運(yùn)行擴(kuò)展)作為繼AutoLISPADS后的第三代開(kāi)發(fā)工具,采用全新的面向?qū)ο缶幊碳夹g(shù)。

             

                   19856月推出的AutoCAD2.17版本使用AutoLISP作為AUTOCAD內(nèi)嵌語(yǔ)言,與AUTOCAD綁定一起,向用戶(hù)提供了用AutoLISP設(shè)計(jì)應(yīng)用程序的二次開(kāi)發(fā)環(huán)境。AutoLISP是種解釋型語(yǔ)言,主要用來(lái)修改和擴(kuò)充ACAD的命令及系統(tǒng)菜單、設(shè)計(jì)對(duì)話(huà)框驅(qū)動(dòng)程序、實(shí)現(xiàn)對(duì)圖形庫(kù)的直接訪(fǎng)問(wèn)和修改。這是AUTOCAD提供的第一代開(kāi)發(fā)環(huán)境

                   第二代開(kāi)發(fā)環(huán)境是R11版本提供的ADSAUTOCAD Development System)開(kāi)發(fā)系統(tǒng)。該系統(tǒng)實(shí)際上向用戶(hù)提供了用C語(yǔ)言編寫(xiě)應(yīng)用程序的開(kāi)發(fā)環(huán)境。ADS環(huán)境用C語(yǔ)言編寫(xiě),除了可以使用標(biāo)準(zhǔn)C庫(kù)函數(shù)外,還可以使用對(duì)AUTOCAD進(jìn)行操作的ADS函數(shù)。ADS雖脫離了AUTOCAD環(huán)境,但其編寫(xiě)的程序不能單獨(dú)運(yùn)行,只能作為一組外部函數(shù)被AUTOLISP裝入和調(diào)用,實(shí)際上就是在AUTOLISP之上包了一層,是AUTOLISP的客戶(hù)。

            如今,在AUTOCAD2000中不再支持ADS開(kāi)發(fā)。ADS已完全被ARX所取代。

                   AUTOCAD第三代開(kāi)發(fā)環(huán)境和工具包括ObjectARXVBAVisual LISP

             

                存儲(chǔ)在AutoCAD數(shù)據(jù)庫(kù)的對(duì)象(DBObject),包括可見(jiàn)幾何實(shí)體對(duì)象和不可見(jiàn)的非幾何對(duì)象等,以組符號(hào)表和一個(gè)有名對(duì)象字典的結(jié)構(gòu)形式組織而成,符號(hào)表和數(shù)據(jù)字典為容器對(duì)象(Container Object),包含了其他對(duì)象,其作用是組織和管理數(shù)據(jù)庫(kù)對(duì)象。數(shù)據(jù)庫(kù)主要包括有9個(gè)符號(hào)表和1個(gè)對(duì)象字典。 

             

            符號(hào)表 

            AutoCAD數(shù)據(jù)庫(kù)中的9個(gè)符號(hào)表,分別是: 

            1)塊表(BlockTabLe) 

            2)尺寸標(biāo)注樣式表(DimStyleTable) 

            3)層表(LayerTable) 

            4)線(xiàn)型表(LinetypeTable)  

            5)應(yīng)用程序注冊(cè)表(RegAppTable) 

            6)文字樣式表(TextStyleTable) 

            7)用戶(hù)坐標(biāo)系表(UCSTable) 

            8)視口表(ViewportTable) 

            9)視圖表(ViewTable) 

                 

                塊表中存儲(chǔ)實(shí)體的記錄稱(chēng)為塊表記錄,即所有的實(shí)體均存儲(chǔ)在塊表記錄中,通常的實(shí)體都存儲(chǔ)在MODEL_SPACE塊中;層表中的記錄存儲(chǔ)層的有關(guān)信息;尺寸標(biāo)注樣式表、層表、線(xiàn)型表和文字樣式表等均用來(lái)存儲(chǔ)相應(yīng)的表記錄。 

             

            對(duì)象字典 

                有名對(duì)象字典是存儲(chǔ)一般對(duì)象的容器,可用來(lái)存儲(chǔ)任何數(shù)據(jù)庫(kù)對(duì)象和子類(lèi),主要包括組(GROUP)和多線(xiàn)(MLINE)樣式兩個(gè)數(shù)據(jù)庫(kù)字典。用戶(hù)也可以創(chuàng)建一個(gè)新的“用戶(hù)對(duì)象字典”,并存儲(chǔ)于對(duì)象字典中。 在實(shí)際開(kāi)發(fā)中,可以將應(yīng)用程序的“擴(kuò)展對(duì)象”存放在“用戶(hù)對(duì)象字典”中,“擴(kuò)展對(duì)象”的“擴(kuò)展記錄和數(shù)據(jù)”通過(guò)鏈表的形式存儲(chǔ)在對(duì)象字典中,對(duì)于該類(lèi)對(duì)象,不另外存儲(chǔ)到塊表。關(guān)于擴(kuò)展對(duì)象,后面有詳細(xì)說(shuō)明。

             

             

            數(shù)據(jù)庫(kù)的創(chuàng)建及訪(fǎng)問(wèn)

             

            數(shù)據(jù)庫(kù)的初始化

                   進(jìn)入AUTOCAD環(huán)境,系統(tǒng)會(huì)自動(dòng)生成一個(gè)缺省的數(shù)據(jù)庫(kù),庫(kù)中包含9個(gè)符號(hào)表和一個(gè)有名對(duì)象字典。如,層表有一個(gè)0層記錄;塊表中有“MODEL_SPACE”(模型空間)和“PAPER_SPACE(圖紙空間)兩條記錄;線(xiàn)型表中有“CONTINUOUS”、“BY_LAYER”和“BY_BLOCK”記錄;應(yīng)用程序注冊(cè)表中有“ACAD”記錄;文字樣式表中有“STANDARD”記錄;有名對(duì)象字典中包含“GROUP字典”和“MLINE字典”,其中“MLINE字典”中有一條“STANDARD”字體樣式記錄。

             

            基本實(shí)體的創(chuàng)建及訪(fǎng)問(wèn)

             

             

            圖塊

                   圖塊是若干實(shí)體的集合,也是AUTOCAD數(shù)據(jù)庫(kù)中的一種對(duì)象,通常分為不帶屬性的簡(jiǎn)單圖塊和帶屬性的復(fù)雜圖塊兩種。作為一個(gè)整體來(lái)看待,以簡(jiǎn)化操作。

                   用戶(hù)自定義的圖塊分為“塊”和“屬性塊”兩種。塊只包含圖形信息,屬性塊還可以包含非圖形信息,這些屬性信息是塊的組成部分之一。屬性塊必須先用ATTDEF定義屬性,然后用BLOCK將其定義為圖塊的一部分。

             

            簡(jiǎn)單塊的定義

             

            屬性塊的定義

                   屬性塊是由構(gòu)成圖塊的實(shí)體和附加信息(屬性)組成。定義屬性塊主要包括塊和屬性的的定義,塊的定義與不帶屬性塊簡(jiǎn)單塊一樣,屬性的定義主要是通過(guò)調(diào)用AcDbAtrributeDefinition實(shí)現(xiàn)。如下示例代碼定義了圓度公差標(biāo)注符號(hào),其中圓度公差值定義為塊的屬性,在圖塊插入時(shí)輸入,缺省值為0.3

                   //1.定義塊

                   OdDbBlockTableRecord *pBTableRec = new OdDbBlockTableRecord();

                   pBTableRec->setName();

                   ….   ..

                   OdDbBlockTable *pBTable = pDwgDB->getBlockTable(pBTable,acdb:kForWrite);

                   OdDbObjectID id;

                   pBTable->add(id,pBTableRec);

                   //2.生成組成塊的實(shí)體:基本線(xiàn)、圓

                   //基本實(shí)體創(chuàng)建過(guò)程略

                   ……

                   //將實(shí)體附到塊中

                   pBTableRec->appendAcDbEntity(pLine,id);

                   pBTableRec->appendAcDbEntity(pCirle,id);

                   ……

                   //3.定義塊的屬性

                   OdGePoint3d pt(8,1.5,0);

                   OdDbAtrributeDefinition *pAttDef = new OdDbAtrributeDefinition();

                   //設(shè)置塊的屬性值


                   pAttDef->setPoint(pt);                                      //設(shè)置屬性位置

                   pAttDef ->setPrompt(“請(qǐng)輸入圓度公差:”);      //設(shè)置屬性提示

                   pAttDef->setTextString(0.3);                             //設(shè)置缺省值

                   pAttDef->setXXX();

                   ……

                   //4。將屬性定義加入到圖塊中

                   pBTableRec->appendAcDbEntity(id,pAttDef);

                   ……

                  

                   創(chuàng)建屬性實(shí)體函數(shù)原型:

                   OdDbAtrributeDefinition{      const OdDbPoint3d &position,

                                                      const char* text,    const char* tag,

                                                      const char* prompt,

                                                      OdDbObjectID style

                                                      };

            參數(shù)說(shuō)明:

             

            Position   屬性在WCS坐標(biāo)系中的位置。

            Text        屬性的缺省值

            Tag        屬性標(biāo)簽

            Prompt    屬性提示

            Style       文字樣式ID

             

             

            簡(jiǎn)單塊的引用

                   pBlkRef->setBlockTableRecord(blockid);//設(shè)置關(guān)聯(lián)。

                  

             

            屬性塊的引用

                   屬性塊的引用分成塊引用和向插入的塊中附加屬性信息兩步。

                   與創(chuàng)建簡(jiǎn)單塊引用一樣,將一個(gè)屬性塊插入當(dāng)前圖形的塊表記錄中并未包含其屬性。在塊定義中的附加屬性信息必須通過(guò)調(diào)用AcDbBlockReference類(lèi)的成員函數(shù)appendAttribute才能加入到塊引用中。塊引用方法與前一致,先主要說(shuō)說(shuō)屬性的插入方法。

                   在插入屬性時(shí),必須檢索出屬性塊定義的所有附加信息,然后將其附加于塊引用的相應(yīng)實(shí)體上,這需要遍歷塊的所有實(shí)體。

                   過(guò)程如下:

            1.得到塊引用。

            2.遍歷塊引用中的實(shí)體。

            3.得到屬性實(shí)體指針。

            4.將屬性對(duì)象附加給塊引用。

             

             

                   對(duì)象字典的操作和使用

                          對(duì)象字典是一種通用的對(duì)象存儲(chǔ)容器,它可以存儲(chǔ)任何類(lèi)型的對(duì)象,包括其他對(duì)象字典、數(shù)據(jù)庫(kù)對(duì)象和應(yīng)用程序創(chuàng)建的對(duì)象。與符號(hào)表相比,對(duì)象字典使用比較靈活,它可以實(shí)現(xiàn)符號(hào)表無(wú)法實(shí)現(xiàn)的一些特殊功能。

            它由三個(gè)部分構(gòu)成:

            1. 組字典(Group Dictionary

            2. 多線(xiàn)樣式字典(Mline Style Dictionary)

            3. 用戶(hù)定義的對(duì)象字典。

            前兩者為ACAD缺省的數(shù)據(jù)庫(kù)對(duì)象。用戶(hù)定義的對(duì)象字典一般由應(yīng)用程序創(chuàng)建。

             

                   組字典

                          組是數(shù)據(jù)庫(kù)對(duì)象的有序集合,是組字典的成員。從層次關(guān)系看,組是管理其所包含對(duì)象的容器,而組字典是管理組對(duì)象的容器。一個(gè)組實(shí)可以認(rèn)為是一個(gè)選擇集。當(dāng)組中一個(gè)實(shí)體被刪除時(shí),該實(shí)體自動(dòng)地從組中移出,當(dāng)恢復(fù)被刪除實(shí)體時(shí),該實(shí)體又自動(dòng)加入到組中。使用組的目的就是為了簡(jiǎn)化操作,容易實(shí)現(xiàn)對(duì)一批對(duì)象的顏色、層和線(xiàn)型屬性的統(tǒng)一修改。

                   組字典中包含若干個(gè)組。

                          組字典的操作大致步驟如下:

            1.通過(guò)getGroupDictionary()獲得組字典指針。

            2.創(chuàng)建組對(duì)象new OdDbGroup,并加到組字典中。

            3.將實(shí)體加入到組對(duì)象中。

            4.設(shè)置各組的屬性。

             

                          多線(xiàn)樣式字典的操作及使用

                                 多線(xiàn)是指多條互相平行的直線(xiàn),其中各條線(xiàn)的顏色、線(xiàn)型和間距等屬性可不相同,多線(xiàn)的這些屬性由多線(xiàn)樣式定義。多線(xiàn)樣式作為一個(gè)數(shù)據(jù)庫(kù)對(duì)象存儲(chǔ)在多線(xiàn)樣式字典中。定義多線(xiàn)樣式步驟如下:

                                 1.通過(guò)getMLineDictionary獲得多線(xiàn)樣式字典指針。

            2.創(chuàng)建多線(xiàn)樣式對(duì)象OdDbMLineStyle

            3.利用OdDbDictionary成員函數(shù)setAt將多線(xiàn)樣式對(duì)象加入到樣式字典中。

            3.設(shè)置多線(xiàn)樣式的屬性。如名稱(chēng)、元素屬性、多線(xiàn)特性。

             

                          多線(xiàn)對(duì)象

                                 多線(xiàn)實(shí)體,是塊表記錄中的OdDbMline類(lèi)對(duì)象。創(chuàng)建多線(xiàn)對(duì)象方法及過(guò)程與OdDbLine基本一樣。

             

                   用戶(hù)對(duì)象字典操作及使用

                   用戶(hù)在應(yīng)用程序中定義的字典為用戶(hù)字典。用戶(hù)對(duì)象字典的特別之處在于它可以包含任何類(lèi)型的對(duì)象。如實(shí)體對(duì)象、自定義對(duì)象和數(shù)據(jù)對(duì)象等。

                          用戶(hù)對(duì)象字典創(chuàng)建步驟:

                   1通過(guò)getNamedObjectsDictionary得到對(duì)象字典指針。

                   2定義新的用戶(hù)對(duì)象字典加入到對(duì)象字典中。

                   如:

                          pNamedObj = getNamedObjectsDictionary();

                          pDict = new OdDbDictionary();

                          pNamedObj->setAt(“USER_DICT”,pDict,dictID);

                   3加入實(shí)體對(duì)象到用戶(hù)字典中

                          pDict->setAt(ObjName,pObj,objID);

             

                   通常加入到用戶(hù)字典中的對(duì)象為ACAD的可見(jiàn)對(duì)象,該對(duì)象已存在于數(shù)據(jù)庫(kù)的塊表記錄中。如果在程序中直接生成實(shí)體時(shí),必須先將其加入到塊表記錄中,然后才能加入到用戶(hù)字典中。

             

             

            擴(kuò)展記錄

                   擴(kuò)展記錄屬于OdDbXRecord類(lèi)的對(duì)象。可用來(lái)定義任何類(lèi)型的數(shù)據(jù)。擴(kuò)展記錄的數(shù)據(jù)項(xiàng)采用結(jié)果緩沖區(qū)鏈表的形式定義。每項(xiàng)由數(shù)據(jù)類(lèi)型(也就是組碼)和值組成。

                   擴(kuò)展記錄通常用來(lái)表示應(yīng)用程序定義的特定數(shù)據(jù)。在ACAD中,應(yīng)用程序可以定義擴(kuò)展數(shù)據(jù)xdata和擴(kuò)展記錄。

                   擴(kuò)展記錄的創(chuàng)建過(guò)程:

                          1.獲得對(duì)象字典指針。

                          2.新建一個(gè)用戶(hù)字典,并加入到對(duì)象字典中。

                          3.創(chuàng)建新的擴(kuò)展記錄,并加入到用戶(hù)對(duì)象字典中。

                   如:OdDbXRecord* pRec = new OdDbXRecord();

                   pDic->setAt(“USER_DIC”,pRec,recID);

            4.用ads_buildlist函數(shù)構(gòu)造由擴(kuò)展記錄數(shù)據(jù)項(xiàng)組成的緩沖區(qū)鏈表

            5.調(diào)用setFromRbChain將鏈表設(shè)置到擴(kuò)展記錄中。

             

            示例如下:

            //1。獲得對(duì)象字典指針

            OdDbDictionay* pNamedDict = NULL;

            pDwgDb->getNamedObjectsDictionary(pNamedDict,OdDb::kForWrite);

             

            //2.新建一個(gè)用戶(hù)對(duì)象字典,并加入到對(duì)象字典中。

            OdDbDictionary* pDic = new OdDbDictionary()

            OdDbObjectID dicID

            pNamedDict->setAt(“USER_DIC”,pDic,dicID)

             

            //3.創(chuàng)建擴(kuò)展記錄,并加入到用戶(hù)對(duì)象字典中。

            OdDbXRecord * pRec= new OdDbXRecord()

            OdDbObjectID recID

            pDic->setAt(“DIC_REC1”,pRec,recID)

             

            //4。創(chuàng)建擴(kuò)展數(shù)據(jù)緩沖區(qū),并加入到擴(kuò)展記錄中。

            Struct_resBuf* pHead= NULL

            //創(chuàng)建鏈表數(shù)據(jù)

            //(數(shù)據(jù)類(lèi)型,值)數(shù)據(jù)對(duì)形成鏈表

            pHead= buildlist(OdDb::kDxfText,“圖號(hào):01-05 

                                 OdDb::kDxfText,“材料:鑄鐵”,

                                 OdDb::kDxfText,“數(shù)量:3件”,

                                 OdDb::kDxfReal,……      

                                 0)

            //將緩沖區(qū)存到擴(kuò)展記錄中。

            pRec->setFromRbChain(*pHead)

            ……

                

            用戶(hù)對(duì)象(Object)/實(shí)體(Entity)
                          在ACAD數(shù)據(jù)庫(kù)中,用戶(hù)自定義對(duì)象為不可見(jiàn)的數(shù)據(jù)對(duì)象,從 OdDbObject類(lèi)派生,新建的用戶(hù)對(duì)象,不需作為塊表記錄加到塊表中,通常只加到用戶(hù)對(duì)象字典; 自定義實(shí)體為可見(jiàn)的幾何對(duì)象,從OdDbEntity派生(該類(lèi)實(shí)際上也是OdDbObject的子類(lèi)),新建用戶(hù)實(shí)體時(shí),除加到用戶(hù)對(duì)象字典外,還需加到塊表中
                          在使用用戶(hù)定義對(duì)象前,必須先調(diào)用類(lèi)的虛接口rxInit()對(duì)用戶(hù)類(lèi)進(jìn)行初始化.
            xInit()函數(shù)內(nèi)部完成如下幾項(xiàng)工作:
            1.       登記用戶(hù)類(lèi)
            2.       創(chuàng)建類(lèi)描述符對(duì)象
            3.       將類(lèi)描述符對(duì)象加入類(lèi)字典(OdrxClassDictionary,專(zhuān)為存放用戶(hù)類(lèi)信息)。
            (在ObjectARX中,初始化時(shí)還調(diào)用了acarBuildClassHieranchy()函數(shù)將新類(lèi)添加到ACAD系統(tǒng)的類(lèi)層次結(jié)構(gòu)中)。
            如:
                     void ExCustObjsModule::initApp()
                     {
                      ExCustObject::rxInit();
                      ExCustEntity::rxInit();
                      ExSphere::rxInit();   
                     }
             
            另外在定義用戶(hù)對(duì)象/實(shí)體的頭文件和實(shí)現(xiàn)文件中,分別利用如下兩個(gè)宏,以協(xié)助xInit()函數(shù)完成用戶(hù)類(lèi)的登記及相關(guān)工作。
                     //頭文件
            ODDB_DECLARE_MEMBERS(ExCustObject);
                     //定義文件
            ODRX_DXF_DEFINE_MEMBERS(ExCustObject,
                                    OdDbObject,
                                    DBOBJECT_CONSTR,
                                    OdDb::vAC15,
                                    OdDb::kMRelease0,
                                    0,
                                    EXCUSTOBJECT,
                                    ExCustObjs|Description: DWGdirect Run-time Extension Example)
             
            在定義時(shí),不論是定義用戶(hù)對(duì)象還是定義用戶(hù)實(shí)體,都必須重載如下四個(gè)虛接口:
                     /**  Description:   Reads the DWG data of this object.
                       Arguments:   pFiler (I) Filer object from which data are read.
                      Remarks:    Returns the filer status
                      This function is called by dwgIn() to allow the object to read its data.
                     When overriding this function:
                   1) Call assertWriteEnabled().
                       2) Call the parent class's dwgInFields(pFiler).
                      3) If it returns eOK, continue; otherwise return whatever the parent's dwgInFields(pFiler) returned.
                      4) Call the OdDbDwgFiler(pFiler) methods to read each of the object's data items in the order they were written.
                      5) Return pFiler->filerStatus().
                            */
                virtual OdResult dwgInFields( OdDbDwgFiler* pFiler);
             
             /**Description: Writes the DWG data of this object.
                     Arguments: pFiler (I) Pointer to the filer to which data are written.
                Remarks:   Returns the filer status.
                This function is called by dwgIn() to allow the object to write its data.
                When overriding this function:
                 1) Call assertReadEnabled().
                     2) Call the parent class's dwgOutFields(pFiler).
                3) If it returns eOK, continue; otherwise return whatever the parent's dwgOutFields(pFiler) returned.
                4) Call the OdDbDwgFiler(pFiler) methods to write each of the object's data items in the order they were written.
                5) Return pFiler->filerStatus(). */
                   virtual OdResult dwgOutFields(OdDbDwgFiler* pFiler);
             
             
            virtual OdResult dxfInFields(OdDbDxfFiler* pFiler);
            virtual OdResult dxfOutFields(OdDbDxfFiler* pFiler);
             
            另外,自定義對(duì)象和自定義實(shí)體根據(jù)實(shí)現(xiàn)不同的功能和需要,將重載不同的接口,:
                          1.自定義對(duì)象:
            根據(jù)功能需要,可能需重載的函數(shù)
                     /** Description:    Perform an *audit* operation on this object.
                Arguments:    pAuditInfo (I) Pointer to an OdDbAuditInfo object.
                Remarks: When overriding this function for a custom class, first call OdDbObject::audit(pAuditInfo)  to      validate the *audit* operation. */  
                   virtual void audit( OdDbAuditInfo* pAuditInfo);
                  
                     /**   Description:    Called as the first operation as this object is being closed, for
                *database* -resident objects only.
                 Remarks:   This function is notified just before the current open operation is to be closed, giving this            function the ability to cancel the close.
                   Returns Od::eOk if and only if close() is to continue.**/
            virtual void subClose();
             
                     /**   Description:   Performs a deep *clone* of this object.
                        Arguments:   ownerIdMap (I) Owner's ID map.
                           Remarks:   Returns a smart pointer to the newly created *clone*,and adds a record to the specified ID map.**/
                virtual OdDbObjectPtr deepClone(OdDbIdMapping& ownerIdMap) const;
                  
                     /** Description: Performs a shallow *clone* of this object.
                          Arguments: ownerIdMap (I) Owner's ID map.
                             Remarks: Returns a smart pointer to the newly created *clone*, and adds a record to the specified ID map.*/
                   virtual OdDbObjectPtr wblockClone(OdDbIdMapping& ownerIdMap) const;
            virtual OdResult subErase(bool erasing);
            virtual void subHandOverTo( OdDbObject* newObject);
            virtual void subOpen( OdDb::OpenMode mode);
            virtual void subSwapIdWith(   const OdDbObjectId& otherId, bool swapXdata        = false,   bool swapExtDict = false);
             
                          2.自定義實(shí)體
            由于自定義實(shí)體,為可見(jiàn)對(duì)象,則必須重載如下接口:
            //繪制自定義實(shí)體,用于實(shí)體的顯示
            //模型空間的顯示
                   virtual bool worldDraw( OdGiWorldDraw* pWd) const;
            //視圖關(guān)聯(lián)的顯示
                   virtual void viewportDraw( OdGiViewportDraw* pVd) const;
             
                   //當(dāng)自定義實(shí)體作為代理對(duì)象保存時(shí),則需重載saveas()接口(該接口在DWGdirect中未實(shí)現(xiàn)):
                   virtual void saveAs(OdGiWorldDraw* mode, OdDb::EntSaveAsType st);
             
                   /** Description: Returns the WCS geometric *extents* of this entity.
                Arguments: extents (O) Receives the *extents*.
                The *extents* are the WCS corner points of a box, aligned with the
            WCS axes, that encloses the 3D *extents* of this entity.    */
            //包含實(shí)體的長(zhǎng)方體的頂點(diǎn),也即實(shí)體所占的空間
             virtual OdResult getGeomExtents(
                OdGeExtents3d& extents) const;
                    
                     /*    Description:   Applies the 3D transformation matrix to this entity.
                     */
                   virtual OdResult transformBy( const OdGeMatrix3d& xfm);
                  
                     /** Description:   Creates a copy of this entity, and applies the supplied transformation
                to the newly created copy.
                  */
             virtual OdResult getTransformedCopy( const OdGeMatrix3d& xfm,               OdDbEntityPtr& pCopy) const;
             
                     /** Description:   Returns all grip points of this entity.         */
             virtual OdResult getGripPoints( OdGePoint3dArray& gripPoints ) const;
             
                   /**   Description:   Moves the specified grip points of this entity
                Remarks:    Each element in gripPoints has a corresponding entry in indices, which specifies        the index of  the grip point as returned by getGripPoints.           */ 
             virtual OdResult moveGripPointsAt(   const OdGePoint3dArray& gripPoints,
                                           const OdIntArray& indices );
             
                     /** Description:   Explodes this entity into a set of simpler entities. 
                 Note:   Entities resulting from the explosion are appended to the specified array.
                    The newly created entities are not *database* resident.
                    The default implementation of this function returns eNotApplicable. This f   unction can be    overridden in custom classes. */
             virtual OdResult explode(OdRxObjectPtrArray& entitySet) const;
             
            //高亮顯示,DWGdirect未實(shí)現(xiàn).
             virtual void highlight(const OdDbFullSubentPath& subId = OdDb::kNullSubent,
            const bool highlightAll = false) const;
             virtual void unhighlight(const OdDbFullSubentPath& subId = kNullSubent,
                const bool highlightAll = false) const;
             
            根據(jù)需要,可能要重載的函數(shù)
             /** Description: Returns all appropriate object snap points of this entity.
                osnapMode will be one of the following: */ 
             virtual OdResult getOsnapPoints(
                OdDb::OsnapMode osnapMode,
                int gsSelectionMark,
                const OdGePoint3d& pickPoint,
                const OdGePoint3d& lastPoint,
                const OdGeMatrix3d& viewXform,
                const OdGeMatrix3d& ucs,
                OdGePoint3dArray& snapPoints ) const;
             
             /** Description:    Returns all stretch points of this entity. */
             virtual OdResult getStretchPoints(   OdGePoint3dArray& stretchPoints ) const;
             
             /** Description:   Moves the specified stretch points of this entity.
             virtual OdResult moveStretchPointsAt( const OdGePoint3dArray& stretchPoints,
                const OdIntArray& indices );
             
             3.用戶(hù)對(duì)象簡(jiǎn)單示例:
            //聲明自定義對(duì)象
            class EXCUSTOBJEXPORT ExCustObject : public OdDbObject
            {
                     static const int lastKnownVersion;
                     UINT m_nCustValue;
            public:
             // Macro to declare
             ODDB_DECLARE_MEMBERS(ExCustObject);
             ExCustObject();
             virtual ~ExCustObject();
             static int getVersion();
             
             // Methods to override
             OdResult dwgInFields(OdDbDwgFiler* pFiler);
             void dwgOutFields(OdDbDwgFiler* pFiler) const;
             OdResult dxfInFields(OdDbDxfFiler* pFiler);
             void dxfOutFields(OdDbDxfFiler* pFiler) const;
            };
               
            //定義
            ODRX_DXF_DEFINE_MEMBERS(ExCustObject,
                                    OdDbObject,
                                    DBOBJECT_CONSTR,
                                    OdDb::vAC15,
                                    OdDb::kMRelease0,
                                    0,
                                    EXCUSTOBJECT,
                                    ExCustObjs|Description: DWGdirect Run-time Extension Example)
             
            const int ExCustObject::lastKnownVersion = 2;
            //
            OdResult ExCustObject::dwgInFields(OdDbDwgFiler* pFiler)
            {
             OdDbObject::dwgInFields(pFiler);
             m_nCustValue = pFiler->rdInt32();
              return eOk;
            }
            //寫(xiě)
            void ExCustObject::dwgOutFields(OdDbDwgFiler* pFiler) const
            {
                     OdDbObject::dwgOutFields(pFiler);
                     pFiler->wrInt32(m_nCustValue);
            }
             
             
             4.用戶(hù)實(shí)體簡(jiǎn)單示例:
            //聲明自定義實(shí)體
            class EXCUSTOBJEXPORT ExCustEntity : public OdDbCircle
            {
             static const OdInt16 lastKnownVersion;
             OdInt16 m_nCount;
            public:
             // Macro to declare
             ODDB_DECLARE_MEMBERS(ExCustEntity);
             
             ExCustEntity();
             virtual ~ExCustEntity();
             
             // Methods to override
            //讀寫(xiě)
                  OdResult dwgInFields(OdDbDwgFiler* pFiler);
                     void dwgOutFields(OdDbDwgFiler* pFiler) const;
                  OdResult dxfInFields(OdDbDxfFiler* pFiler);
                  void dxfOutFields(OdDbDxfFiler* pFiler) const;
              //繪制
                     bool worldDraw(OdGiWorldDraw * pWd) const;
            };
             
            //定義
            ODRX_DXF_DEFINE_MEMBERS(ExCustEntity,
                                    OdDbCircle,
                                    DBOBJECT_CONSTR,
                                    OdDb::vAC15,
                                    OdDb::kMRelease0,
                                    OdDbProxyEntity::kAllAllowedBits,
                                    EXCUSTENTITY,
                                    ExCustObjs|Description: DWGdirect Run-time Extension Example)
             
            const OdInt16 ExCustEntity::lastKnownVersion = 1;
             
            OdResult ExCustEntity::dwgInFields(OdDbDwgFiler* pFiler)
            {
             OdResult res = OdDbCircle::dwgInFields(pFiler);
             if (res != eOk)
             {
                return res;
             }
             
             m_nCount = pFiler->rdInt16();
             return eOk;
            }
             
            void ExCustEntity::dwgOutFields(OdDbDwgFiler* pFiler) const
            {
             OdDbCircle::dwgOutFields(pFiler);
             pFiler->wrInt16(m_nCount);
            }
             
            //繪制實(shí)體
            bool ExCustEntity::worldDraw(OdGiWorldDraw * pWd) const
            {
             assertReadEnabled();
             OdGePoint3d ptCenter(center());
             OdGeVector3d vNormal(normal());
             double dRadius = radius();
             int nCount = m_nCount;
             
             OdDbHatchPtr pHatch = OdDbHatch::createObject();
             // Set the hatch properties.
             pHatch->setPropertiesFrom(this);
             pHatch->setAssociative(false);
             pHatch->setPattern(OdDbHatch::kPreDefined, "ANGLE");
             pHatch->setHatchStyle(OdDbHatch::kNormal);
             pHatch->setNormal(vNormal);
             pHatch->setElevation(ptCenter.z);
             EdgeArray edgePtrs;
             if (nCount < 1)
             {
                pWd->geometry().circle(ptCenter, dRadius, vNormal);
                OdGeCircArc2d *cirArc = new OdGeCircArc2d(OdGePoint2d(ptCenter.x, ptCenter.y), dRadius);
                edgePtrs.append(cirArc);
                pHatch->appendLoop(OdDbHatch::kDefault, edgePtrs);
             }
             else
             {
                OdGeVector3d vDisp(radius(), 0., 0.);
                double step = Oda2PI / nCount;
                while (nCount--)
                {
                  OdGePoint3d ptC(ptCenter + vDisp);
                  pWd->geometry().circle(ptC, dRadius, vNormal);
                  vDisp.rotateBy(step, vNormal);
                  OdGeCircArc2d *cirArc = new OdGeCircArc2d(OdGePoint2d(ptC.x, ptC.y), dRadius);
                  edgePtrs.resize(0);
                  edgePtrs.append(cirArc);
                  pHatch->appendLoop(OdDbHatch::kDefault, edgePtrs);
                }
             }
             pHatch->worldDraw(pWd);
             return true;
            }
                         
             代理對(duì)象/實(shí)體(OdDbProxyObject/OdDbProxyEntity)
                          代理對(duì)象/實(shí)體是AutoCad在內(nèi)存中創(chuàng)建的,作為自定義對(duì)象/實(shí)體的一個(gè)代理數(shù)據(jù)容器。當(dāng)AUTOCAD讀取一個(gè)包含不可能實(shí)例化的用戶(hù)自定義對(duì)象/實(shí)體的文件時(shí)(也就是定義用戶(hù)對(duì)象/實(shí)體的二次開(kāi)發(fā)模塊未加載),ACAD就自動(dòng)為自定義實(shí)體和對(duì)象創(chuàng)建代理對(duì)象/實(shí)體。但如果加載了可以實(shí)例化自定義對(duì)象的二次開(kāi)發(fā)模塊后,代理對(duì)象/實(shí)體就可恢復(fù)為自定義對(duì)象/實(shí)體。代理通常存在于系統(tǒng)的內(nèi)存中,只是個(gè)中間過(guò)渡數(shù)據(jù)。
                          可以將代理對(duì)象/實(shí)體看成一個(gè)包含用戶(hù)對(duì)象的塊包,就是對(duì)用戶(hù)對(duì)象屬性和數(shù)據(jù)的一個(gè)封裝。寫(xiě)入文件時(shí),如果二次開(kāi)發(fā)模塊未加載,代理包就自動(dòng)進(jìn)行串行化保存,通常情況下,寫(xiě)入的數(shù)據(jù)與讀取的數(shù)據(jù)一致,不包含代理對(duì)象的數(shù)據(jù),如果保存前后文件類(lèi)型不同時(shí)(dwg\dxf),寫(xiě)入時(shí)將整個(gè)代理對(duì)象數(shù)據(jù)寫(xiě)到文件中。
             
            代理實(shí)體顯示
                          如果二次開(kāi)發(fā)模塊未加載,ACAD就不能使用自定義實(shí)體的worldDraw()或viewportDraw()函數(shù)來(lái)顯示代理實(shí)體,但可以利用自定義實(shí)體的圖形元文件中的信息,這些信息包含實(shí)體最后一次保存文件時(shí),繼承于worldDraw()函數(shù)或saveAs()函數(shù)的數(shù)據(jù)。顯示格式分:實(shí)體和邊界框兩種。
             
                         
            五種坐標(biāo)系
                   1.世界坐標(biāo)系(WCS)
                          是其它坐標(biāo)系的參照坐標(biāo)系,其他坐標(biāo)系都相對(duì)于它定義的(是種概念坐標(biāo)系.)
             
            2.用戶(hù)坐標(biāo)系(UCS)
                          是一種工作坐標(biāo)系,通常,ACAD內(nèi)部存儲(chǔ)或參數(shù)傳遞的點(diǎn)都是UCS坐標(biāo)點(diǎn).
             
            3.實(shí)體坐標(biāo)(ECS)
                          為了減少存儲(chǔ)空間,而設(shè)置的坐標(biāo)系,在ACAD中,不能直接該坐標(biāo)的點(diǎn),必須先轉(zhuǎn)換成UCS點(diǎn).
             
            4.顯示坐標(biāo)系(DCS).
             
            5.圖紙空間坐標(biāo)系(PSDCS).

               

             

            視圖、視口

                   圖形屏幕上用于顯示圖形的一個(gè)矩形區(qū)域稱(chēng)為視口,通常可以把整個(gè)圖形屏幕作為一個(gè)視口,也可以將屏幕設(shè)置成多個(gè)視口。視口中的圖形稱(chēng)為視圖。利用視圖管理技術(shù),可以把當(dāng)前視口中復(fù)雜的圖形按不同的窗口大小設(shè)置,并以視圖名為標(biāo)識(shí)保存在數(shù)據(jù)庫(kù)中。在需要時(shí),顯示指定視圖以滿(mǎn)足對(duì)圖形編輯和瀏覽的需求。

                   視圖作為視圖表OdDbViewTable中一條視圖記錄OdDbViewTableRecord保存在數(shù)據(jù)庫(kù)中。把當(dāng)前視口中指定窗口內(nèi)的圖形定義為一個(gè)新的視圖操作過(guò)程如下:

                   1.創(chuàng)建視圖類(lèi)對(duì)象OdDbViewTableRecord

                   2.設(shè)置視圖屬性:名、中心點(diǎn)、高、寬

                   3.獲得視圖表OdDbViewTable指針。并將視圖記錄加入其中。

             

             

             

             

                                 附加

             

                                 三維實(shí)體造型

                                        ACAD三維造型包括線(xiàn)框模型、表面模型和實(shí)體模型三種形式。ACADR14版本后,三維造型核心采用ACISAmercian Committee for Interoperable)平臺(tái)來(lái)生成和編輯三維實(shí)體。

             

                                 基本三維實(shí)體生成方法

                                        三維實(shí)體屬于OdDb3dSolid類(lèi)對(duì)象。對(duì)于一個(gè)具體的幾何實(shí)體,即ACIS對(duì)象來(lái)說(shuō),OdDb3dSolid是個(gè)容器和接口,通過(guò)其接口可生成基本的三維實(shí)體及實(shí)體的布爾運(yùn)算。

                   基本三維實(shí)體指:長(zhǎng)方體Box、平截頭體Frustum、球體Sphere、圓環(huán)體Torus、鍥體Wedge等。

            1、 長(zhǎng)方體

                          createBox()

                          參數(shù):長(zhǎng)、寬、高。生成長(zhǎng)方體中心為WCS的原點(diǎn)。

             

            2、 平截頭體(圓柱、圓錐、橢圓錐)

                          createFrustum()

                          參數(shù):高度、X半徑、Y半徑、頂端半徑

                          XY半徑相同,頂端半徑為0,則為圓錐體。

                          XY半徑不相等,頂端半徑為0,則為橢圓錐。

                          頂端半徑不為0,則為圓柱或橢圓柱。

             

            3、 球體

                          createSphere()

                          參數(shù):球體半徑。

            4、 圓環(huán)體

                          createTorus()

                          質(zhì)心在WCS原點(diǎn),Z軸為中心軸。

                          參數(shù):圓環(huán)半徑和圓管半徑。

            5、 契體

                          CreateWedge()

                          長(zhǎng)寬高分別與XYZ軸平行。

                          參數(shù):長(zhǎng)、寬、高

             

                   有上述函數(shù)可創(chuàng)建中心點(diǎn)在WCS原點(diǎn)的簡(jiǎn)單實(shí)體。要將實(shí)體在指定位置生成,則必須進(jìn)行坐標(biāo)變換。如,方向矢量:

                   OdGeVector3d X(1,0,0),Y(0,1,0),Z(0,0,1)

            表示所定義的新坐標(biāo)系統(tǒng)與原WCS坐標(biāo)系統(tǒng)的XYZ軸平行。

            三維變換矩陣是用OdDbMatrix3d類(lèi)的成員函數(shù):

            OdDbMatrix3d& setCoordSystem{

            Const OdDbPoint& origin,

            Const OdDbVector3d& e0,

            Const OdDbVector3d& e1,

            Const OdDbVector3d& e2    

            }

            參數(shù):

                   Origin表示新坐標(biāo)系統(tǒng)的原點(diǎn)。

                   e0\e1\e2表示XYZ坐標(biāo)軸的方向矢量

             

            (一個(gè)矩陣可看成一個(gè)新坐標(biāo)系統(tǒng)的表示形式,由新的坐標(biāo)原點(diǎn)和XYZ坐標(biāo)軸方向矢量構(gòu)成一個(gè)矩陣,也即一個(gè)新的坐標(biāo)系統(tǒng),根據(jù)新的坐標(biāo)系統(tǒng),就可推算出實(shí)體新的坐標(biāo)值)

                   變換

                   transformBy(const OdDbMatrix3d& xform)

                   該函數(shù)功能是將生成的三維實(shí)體按三維幾何變換矩陣變換。也就是將實(shí)體的控制點(diǎn)或特征點(diǎn)進(jìn)行變換,其拓?fù)涮匦员3植蛔儭?/span>

             

            基于二維對(duì)象生成三維實(shí)體

                   在二維對(duì)象的基礎(chǔ)上,通常用拉伸(擠出)或旋轉(zhuǎn)的方法生成三維實(shí)體。

             

            拉伸或擠出

                   是指在圓、橢圓或封閉多線(xiàn)段PloyLine等對(duì)象基礎(chǔ)上,按拉伸或擠出高或指定路徑生成三維實(shí)體。這種方法可以滿(mǎn)足一些簡(jiǎn)單的實(shí)體造型:

            1.              給定高度拉伸或擠出

            Extrude{

            Const OdDbRegion* pRegion,

            Double height,

            Double taper

            }

            Region表示面域?qū)ο蟮闹羔槪?/span>

                       面域?qū)ο罂梢岳斫鉃橛删€(xiàn)條組成的一個(gè)封閉的區(qū)域。

            Height高度

            Taper錐角

             

            2.              指定路徑拉伸或擠出

                   extrudeAlongPath{

                   const OdDbRegion* pRegion,

                   const OdDbCurve* path

                   }

                   Path    擠出路徑,必須是       OdDbLine,OdDbArc,OdDbCircle,OdDbEllipse,OdDbSpline,OdDb2DployLine或非樣條擬合的OdDb3dPloyLine對(duì)象。

                   并、交、差。

             

            旋轉(zhuǎn)

                   是指在圓、橢圓、封閉的二維多段線(xiàn)的基礎(chǔ)上按指定軸旋轉(zhuǎn),從而生成三維實(shí)體。

            Revolve{

                   Const OdDbRegion* pRegion,

                   Const OdGePoint3d& axisPoint,

                   Const OdGeVection3D& axisDir,

                   Double Angle

            }

            axisPoint軸上一點(diǎn)。

            axisDir軸方向矢量。

            Angle旋轉(zhuǎn)角度。

             

            拉伸實(shí)體生成過(guò)程如下:

                     (凸度值:在生成多段線(xiàn)對(duì)象時(shí),該值為0,表示線(xiàn)與線(xiàn)以直線(xiàn)相連接;為1,表示與弧線(xiàn)連接)                       1.確定三維坐標(biāo)點(diǎn)數(shù)組。

                   2.根據(jù)點(diǎn),生成封閉的多段線(xiàn),設(shè)置多線(xiàn)段法向矢量(001),通常于Z軸平行

                   3.根據(jù)多線(xiàn)段對(duì)象獲得封閉邊界線(xiàn)指針數(shù)組

                   4.根據(jù)封閉邊界,生成面域?qū)ο蟆?/span>

                   5.然后根據(jù)面域?qū)ο蠛透叨龋焐扇S實(shí)體。

                  

            三維實(shí)體布爾運(yùn)算

                   以上通過(guò)拉伸和旋轉(zhuǎn)只能生成簡(jiǎn)單的實(shí)體,對(duì)于復(fù)雜的實(shí)體必須通過(guò)布爾運(yùn)算才能實(shí)現(xiàn)。

                   1.(UNION):求兩個(gè)或兩個(gè)以上實(shí)體的并集,即合并為一個(gè)實(shí)體           

                   2.交(INTERSECTION):求兩個(gè)或兩個(gè)以上實(shí)體的交集,即生成實(shí)體的公共部分。

                   3.差(SUBTRACT):將一個(gè)實(shí)體集從另一個(gè)實(shí)體集減去。

             

            布爾運(yùn)算原型:

            BooleanOper{

                   OdDb::BooleanOperType operator,

                   OdDb3dSolid *pSolid

            }

                   Operator 取值為OdDb::kBoolUnion,OdDb::kBoolIntersect,OdDb::kBoolSubtract,分別表示并、交、差運(yùn)算。

                   pSolid為參加布爾運(yùn)算的實(shí)體指針。

             

            復(fù)雜零件的造型

                   對(duì)于實(shí)體表面為空間曲面構(gòu)成的零件,如斜齒輪的齒廓表面,對(duì)這類(lèi)復(fù)雜的零件用簡(jiǎn)單的并、交和差運(yùn)算方法來(lái)造型難以達(dá)到要求,在這種情況下,宜采用機(jī)械加工的方法來(lái)構(gòu)造零件的實(shí)體模型。步驟如下:

                   1.分別定義零件毛坯和加工刀具的OdDb3dSolid類(lèi)對(duì)象。

                   2.利用變換矩陣將刀具移至毛坯位置。

                   3.調(diào)用booleanOper進(jìn)行差運(yùn)算,毛坯實(shí)體減去刀具實(shí)體,也就是除去被加工的部分

                   4.循環(huán)重復(fù)差運(yùn)算,直到完成全部加工。

            例:蝸桿齒輪造型

            刀具的生成:

                OdDbPolyLine * poly = new OdDbPolyline();

                For(int I =0; i<5;i++)

                {

                       //pt2d[]為各頂點(diǎn)的數(shù)組

                       Poly->addVertexAt(I,pt2d[i],(i==3)?0.315:0,0,0)

                       //參數(shù)分別為頂點(diǎn)序號(hào)、坐標(biāo)值、凸度值、起點(diǎn)和終點(diǎn)的寬度

                       //凸度值表示當(dāng)前頂點(diǎn)與下一頂點(diǎn)的連接形式,0為直線(xiàn)連接,非0為圓                        //弧連接,其值0.315為圓弧半徑。

                }

                Poly->setNormal((0,0,1));//設(shè)置方向矢量

             

            經(jīng)如上過(guò)程形成封閉多段線(xiàn),隨后就可求出封閉邊界構(gòu)成的面域?qū)ο螅D(zhuǎn)revolve()生成刀具實(shí)體。實(shí)現(xiàn)代碼略。

             

            毛坯的生成

                通過(guò)圓拉伸造型,生成圓柱體,過(guò)程略。

                初始狀態(tài)下,圓柱體的質(zhì)心在WCS原點(diǎn),Z軸為軸線(xiàn),為便于運(yùn)算,將其轉(zhuǎn)換為以X軸為軸線(xiàn),則方向適量設(shè)置為:

                OdDbVector3d x1(0,0,1),y1(0,1,0),z1(1,0,1)

            X軸旋轉(zhuǎn),則方向矢量相應(yīng)設(shè)置為:

                X1.set(1,0,0)

                Y1.set(0,cos(a),sin(a));

                Z1.set(0,-sin(a),cos(a))

            a為旋轉(zhuǎn)角度。

             

            加工造型過(guò)程:

            刀具的移動(dòng)和圓柱體的旋轉(zhuǎn)是通過(guò)變換矩陣實(shí)現(xiàn),偽碼例如:

                       OdDb3dMatrix mat,mat1;

                       Mat.setCoordSystem(pt,x,y)

                       Mat.setCoordSystem(pt1,x1,y1)

                       //使圓柱體饒X軸旋轉(zhuǎn)

                       p3dSolid->transformBy(mat);

                       //使刀具移到加工位置

                       p3dSolid1->transformBy(mat1);

            //減去加工刀具

            p3dSolid->booleanOper(OdDb::kBoolSubtract, p3dSolid1);

            posted on 2009-05-15 09:54 zmj 閱讀(5982) 評(píng)論(1)  編輯 收藏 引用

            評(píng)論

            # re: AUTOCAD二次開(kāi)發(fā)工具 2015-03-04 14:48 銳英源

            銳英源:精通英語(yǔ)和開(kāi)源,擅長(zhǎng)開(kāi)發(fā)與培訓(xùn),胸懷四海,第一信賴(lài)。
            銳英源是靈活高效的軟件開(kāi)發(fā)技術(shù)服務(wù)機(jī)構(gòu),也是全國(guó)性?xún)r(jià)比最高的軟件開(kāi)發(fā)就業(yè)培訓(xùn)機(jī)構(gòu)。
            銳英源擅長(zhǎng)C語(yǔ)言、C++、C#、ASP.NET、Linux開(kāi)發(fā)和軟件工程,有17年開(kāi)發(fā)經(jīng)驗(yàn),9年教學(xué)和英譯經(jīng)驗(yàn)。
            主頁(yè)www.wisestudy.cn  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            99久久无色码中文字幕| 久久最近最新中文字幕大全| 国产亚洲欧美精品久久久| 久久国产影院| 久久久久亚洲av无码专区喷水| 久久激情亚洲精品无码?V| 久久精品国产网红主播| 亚洲精品tv久久久久久久久久| 嫩草伊人久久精品少妇AV| 久久婷婷色香五月综合激情| 99久久夜色精品国产网站| 久久精品无码专区免费青青 | 久久精品国产亚洲AV大全| 久久无码AV中文出轨人妻| 青青青国产成人久久111网站| 久久大香香蕉国产| 丁香色欲久久久久久综合网| 亚洲国产精品成人久久蜜臀| 国产精品久久久久乳精品爆| 国产精品久久久久…| 久久久久人妻精品一区| 久久久久久精品成人免费图片| 无码乱码观看精品久久| 欧美亚洲另类久久综合婷婷| 久久精品国产亚洲Aⅴ香蕉 | 国产亚州精品女人久久久久久 | 精品国产一区二区三区久久| 日韩精品久久无码中文字幕| 中文字幕热久久久久久久| 亚洲伊人久久成综合人影院 | 国产精品99久久不卡| 亚洲一本综合久久| 久久青青草原国产精品免费| 久久综合中文字幕| 91精品国产91热久久久久福利 | 国产精品毛片久久久久久久| 97久久精品午夜一区二区| 久久美女网站免费| 精品久久久久中文字| 欧洲国产伦久久久久久久| 久久只有这精品99|