bool ImportGeometry (HPROJECT hPr, OBJGEOMETRIE *pOG, long sta[], long lIdent, double *gxi, double *gyi, int iFlags, long &rlONr, ULONG &lIgnore) { INITSTRUCT (*pOG, OBJGEOMETRIE); pOG -> lONr = 0L; pOG -> lIdent = lIdent; pOG -> iFlags = short(iFlags); pOG -> pdblX = gxi; pOG -> pdblY = gyi; ((TEXTGEOMETRIEEX &)pOG).fIndObjProp = FALSE; switch (sta[1]) { case O_PUNKT: pOG -> iObjTyp = OGPunkt; break; case O_LINIE: pOG -> iObjTyp = OGLinie; break; case O_FLAECHE: pOG -> iObjTyp = OGFlaeche; pOG -> iKCnt = AnalyzeAreaContures (lgi, gxi, gyi, &pOG -> plCnt); break; case O_TEXTOBJEKT: pOG -> iObjTyp = OGText; pOG -> iKCnt = RetrieveText (lTextObjMCode, mi, &((TEXTGEOMETRIE *)pOG) -> pText, true); lIgnore = lTextObjMCode; break; case O_TEXTOBJIND: pOG -> dwSize = sizeof(TEXTGEOMETRIEEX); pOG -> iObjTyp = OGLabel; pOG -> iKCnt = RetrieveText (lTextObjMCode, mi, &((TEXTGEOMETRIE *)pOG) -> pText, true); ((TEXTGEOMETRIEEX &)pOG).fIndObjProp = TRUE; lIgnore = lTextObjMCode; break; } pOG -> lCnt = lgi; GEOMETRIEWITHCS GCS; INITSTRUCT (GCS, GEOMETRIEWITHCS); GCS.pOG = pOG; GCS.pICS = ((CImpAscExtension *)g_pTE)->get_CS(); bool fRet = DEX_ModObjGeometrieEx(hPr, GCS); DELETE_OBJ(pOG -> plCnt); rlONr = pOG -> lONr; // neue ObjektNummer return fRet; }
void CBrainMemory::GetMemo(int64 RoomID, deque<tstring>& MemoList){ int64 FatherID,ChildID,RoomType; char buf[30]; CppSQLite3Buffer SQL; if(LBrainHasTable(RoomID)){ //索引空间是否有表,有则表示其为其它空间的空间值 //根据索引表得到其作为空间值时的空间存储ID,存入种子表 ToLBrain(RoomID); int64toa(RoomID,buf); SQL.format("select %s,%s from \"%s\" ;",LB_FATHER_ID,LB_CHILD_ID,buf); CppSQLite3Table t0 = BrainDB.getTable(SQL); for (int row = 0; row < t0.numRows(); row++) { t0.setRow(row); FatherID = t0.getInt64Field(0); ChildID = t0.getInt64Field(1); if(ChildID == -RoomID)continue; RoomType = GetChildType(FatherID,ChildID); if(RoomType == MEMORY_LAN){ //看是否文本空间修饰RoomID tstring Text; if(RetrieveText(ChildID,Text)){ MemoList.push_back(Text); } } } } }
// Geometrie nicht modifizieren, nur Merkmale/Ident korrigieren --------------- bool UpdateFeatures (HPROJECT hPr, LONG &rlONr, ULONG lIdent, long sta[], long mi[]) { // Objekt wiederfinden char *pUIdent = NULL; rlONr = 0L; TX_ASSERT(!(g_fAbglGeom && g_fAbglAttr)); // nie gleichzeitig Attribs und Geometrie abgleichen! // versuchen über GUID zu finden if ('\0' != guid[0]) { OBJECTGUID OUID; INITSTRUCT (OUID, OBJECTGUID); if (SUCCEEDED(CLSIDFromString (WideString(guid), &OUID.guid))) { if (SUCCEEDED(DEX_FindObjectFromGuidEx (hPr, OUID))) rlONr = OUID.lONr; } } // versuchen, über Unique Ident zu finden if (0 == rlONr && RetrieveText (g_ulUniqueId, mi, &pUIdent, false, !g_fImportObj) > 0) rlONr = FindObject (g_ulUniqueId, pUIdent); DELETE_OBJ(pUIdent); if (rlONr > 0) { // Merkmale erzeugen if (m_flag && !CreateFeatures (rlONr, mi, lIdent)) { g_lWithErrors++; // mit Fehlern importiert return false; } ULONG lOldId = (ULONG)DEX_GetObjIdent (rlONr); if (lIdent != lOldId) { MODOBJIDENT MOI; INITSTRUCT(MOI, MODOBJIDENT); MOI.lONr = rlONr; MOI.lNewIdent = lIdent; MOI.iMode = 0; if (!DEX_ModObjectIdent (MOI)) { g_lWithErrors++; // mit Fehlern importiert return false; } } CountObjects (sta[1]); return true; } else g_lNotImported++; // nicht wiedergefunden return false; }
bool CBrainMemory::RetrieveAction(int64 RoomID,int64 RoomValue, tstring& Text,bool IsShunt){ deque<int64> MeaingList; while(1){ //向上漫游,找到父空间空间的ID和逻辑明文,得记忆的形ID CppSQLite3Query Result = LBrainQuery("*",RoomValue,LB_CHILD_ID,RoomID); if(Result.eof())return false; RoomValue = Result.getInt64Field(1); //fatherValuse RoomID = Result.getInt64Field(0); //fatherID if(RoomID == ROOT_SPACE)break; MeaingList.push_front(RoomValue); } assert(MeaingList.size() <3); int64 ActionID = MeaingList.front(); int64 Param = 0; if(MeaingList.size()==2)Param = MeaingList.back(); if(BelongInstinct(ActionID)){ Text = Instinct2Str(ActionID); } else { RetrieveText(ActionID,Text);//返回命令的文本: todo something; } if(IsShunt)Text = _T("and ")+Text; if(Param){ //如果是本能还要返回参数 assert(BelongInstinct(ActionID)); tstring ParamText; RetrieveText(Param,ParamText); Text +=_T(' '); Text += ParamText; } return true; }
//返回一个Ojbect/people的存储路径,不包括CRC32 uint32 CBrainMemory::RetrieveObject(int64 RoomID,tstring& Text){ int64 CurrentRoomValue,RoomType; int64 CurrentID = RoomID; //首先得到意义空间的信息 GetRoomInfo(RoomID,CurrentRoomValue,RoomType); if (RoomType == MEMORY_OBJECT){ Text = _T("Object: "); }else if(RoomType == MEMORY_PEOPLE) { Text = _T("People: "); }else return 0; uint32 crc = CurrentRoomValue; deque<int64> MeaingList; while(1) { //向上漫游,找到父空间空间的ID和逻辑明文,得记忆的形ID CppSQLite3Query Result = LBrainQuery("*",CurrentRoomValue,LB_CHILD_ID,CurrentID); if(Result.eof())return 0; CurrentID = Result.getInt64Field(0); //fatherID if(CurrentID == ROOT_SPACE)break;; CurrentRoomValue = Result.getInt64Field(1); //fatherValuse MeaingList.push_front(CurrentRoomValue); } deque<int64>::iterator It = MeaingList.begin(); deque<int64>::iterator ItEnd = MeaingList.end(); int64 ID = *It; IP ip((uint32)ID); AnsiString s = ip.Get(); tstring ws = UTF8toWS(s); Text += ws; It++; tstring Name; while (It <ItEnd){ ID = *It; Text += _T("\\"); if(!RetrieveText(ID,Name))return 0; Text +=Name; Name=_T(""); It++; }; return crc; }
bool CreateObject (LONG &rlONr, ULONG lIdent, long sta[], long mi[], long lgi, double gxi[], double gyi[]) { HPROJECT hPr = DEX_GetDataSourceHandle(); _ASSERTE(NULL != hPr); if (sta[0] == K_OBJEKT) return r_flag ? CreateKomplexObject (hPr, rlONr, lIdent, mi) : true; // Objekt erzeugen oder wiederfinden, Geometrie schreiben long lONr = 0L; char *pUIdent = NULL; TX_ASSERT(!(g_fAbglGeom && g_fAbglAttr)); // nie gleichzeitig Attribs und Geometrie abgleichen! if (!m_flag || g_fAbglOks || g_fAbglGeom || g_fAbglAttr || 0 != g_ulOksToAttr) { // versuchen über GUID zu finden if ('\0' != guid[0]) { OBJECTGUID OUID; INITSTRUCT (OUID, OBJECTGUID); if (SUCCEEDED(CLSIDFromString (WideString(guid), &OUID.guid))) { if (SUCCEEDED(DEX_FindObjectFromGuid (OUID))) lONr = OUID.lONr; } } // versuchen, über Unique Ident zu finden if (0 == lONr && RetrieveText (g_ulUniqueId, mi, &pUIdent, false, !g_fImportObj) > 0) lONr = FindObject (g_ulUniqueId, pUIdent); } DELETE_OBJ(pUIdent); TEXTGEOMETRIEEX TG; OBJGEOMETRIE *pOG = (OBJGEOMETRIE *)&TG; ULONG lIgnore = 0L; int iFlags = OGForceGeometry|OGNoMemoryObject|OGConverted; bool fRet = true; if (0 == lONr) { // nicht wiedergefunden // Objekt neu erzeugen iFlags |= OGNewObject; fRet = ImportGeometry (hPr, pOG, sta, lIdent, gxi, gyi, iFlags, rlONr, lIgnore); } else { // Abgleich durchführen if (g_fAbglGeom) { // Geometrie abgleichen iFlags |= OGModObject; fRet = ImportGeometry (hPr, pOG, sta, lIdent, gxi, gyi, iFlags, rlONr, lIgnore); } else { // bisherigen Oks wegschreiben if (0 != g_ulOksToAttr) { long lOldIdent = DEX_GetObjIdent(lONr); char cbOKS[MAX_OKS_LENX+1]; if (S_OK == ClassFromIdentX (lOldIdent, cbOKS)) WriteTextMerkmal (lONr, (ULONG)g_ulOksToAttr, cbOKS, strlen(cbOKS)); } // Oks abgleichen if (g_fAbglOks) { if (0 == g_ulOksFromAttr) { // Oks vom EingabeOks nehmen MODOBJIDENT MOI; INITSTRUCT(MOI, MODOBJIDENT); MOI.lONr = lONr; MOI.lNewIdent = lIdent; MOI.iMode = GetMOIMode (sta); DEX_ModObjectIdent(MOI); } else { // Oks aus EingabeAttribut verwenden char *pOks = NULL; if (RetrieveText (g_ulOksFromAttr, mi, &pOks, false, !g_fImportObj) > 0) { // Ident über Oks besorgen long lNewIdent = 0; HRESULT hr = IdentFromClassX (hPr, pOks, (ULONG *)&lNewIdent); if (S_FALSE == hr) { ErrCode RC = IdentIsDefined(lNewIdent); if (RC != EC_OKAY && !DEX_isIdentUsedEx(hPr, lNewIdent)) // neu erzeugen, wenn keine Objekte mit diesem Ident existieren hr = IdentFromClassX (hPr, pOks, (ULONG *)&lNewIdent, true); } if (0 != lNewIdent) { // jetzt Ident modifizieren MODOBJIDENT MOI; INITSTRUCT(MOI, MODOBJIDENT); MOI.lONr = lONr; MOI.lNewIdent = lNewIdent; MOI.iMode = GetMOIMode (sta); DEX_ModObjectIdent(MOI); lIdent = lNewIdent; } } DELETE_OBJ(pOks); } } // evtl. doch noch neues Objekt erzeugen if (g_fImportObj) { iFlags |= OGNewObject; fRet = ImportGeometry (hPr, pOG, sta, lIdent, gxi, gyi, iFlags, rlONr, lIgnore); } else rlONr = lONr; } } if (!fRet) { if (0 == pOG -> lONr) { g_lNotImported++; return false; } else { if (pOG -> iFlags & OGObjectHasGeometryErrors) g_lWithErrors++; // mit Fehlern importiert } } CountObjects (sta[1]); // Objekte zählen // Merkmale erzeugen if (m_flag || g_fAbglAttr) return CreateFeatures (rlONr, mi, lIdent, lIgnore); return true; }
//返回一段逻辑,表达为文字 bool CBrainMemory::RetrieveLogic(int64 RoomID,deque<tstring>& LogicList,tstring* Text/*=NULL*/,bool IsShunt /* = false*/){ int64 CurrentRoomValue,RoomType; int64 CurrentID = RoomID; //首先得到意义空间的信息 GetRoomInfo(RoomID,CurrentRoomValue,RoomType); if(RoomType == MEMORY_ACT){//递归终止 assert(Text != NULL); return RetrieveAction(RoomID,CurrentRoomValue,*Text,IsShunt); } if(RoomType == MEMORY_INSTINCT){ tstring s; if(!RetrieveText(RoomID,s))return false; s = _T("Custom Command : ") + s; s+=_T(';'); LogicList.push_back(s); return true; } if(RoomType != MEMORY_SERIES && RoomType != MEMORY_SHUNT)return false; int64 LogicType = RoomType; deque<int64> MeaingList; while(1) { //向上漫游,找到父空间空间的ID和逻辑明文,得记忆的形ID CppSQLite3Query Result = LBrainQuery("*",CurrentRoomValue,LB_CHILD_ID,CurrentID); if(Result.eof())return false; CurrentID = Result.getInt64Field(0); //fatherID if(CurrentID == ROOT_SPACE)break; CurrentRoomValue = Result.getInt64Field(1); //fatherValuse MeaingList.push_front(CurrentRoomValue); } if(Text) *Text = Format1024(_T("use logic %d"),LogicList.size()); tstring LogicText = Format1024(_T("Logic %d: "),LogicList.size()); LogicList.push_back(LogicText); tstring& NestLogicText = LogicList.back(); IsShunt = RoomType == MEMORY_SHUNT; deque<int64>::reverse_iterator It = MeaingList.rbegin(); while (It != MeaingList.rend()) { CurrentRoomValue = *It; LogicText= _T(""); if (!RetrieveLogic(CurrentRoomValue,LogicList,&LogicText,IsShunt))return false; LogicText +=_T(','); NestLogicText += LogicText; It++; } *NestLogicText.rbegin() =_T(';'); return true; }
Energy* CBrainMemory::RetrieveEnergy(int64 RoomID){ int64 CurrentRoomValue,RoomType; int64 CurrentID = RoomID; //首先得到意义空间的信息 if(!GetRoomInfo(RoomID,CurrentRoomValue,RoomType)){ return NULL; } deque<int64> MeaingList; while(1) { //向上漫游,找到父空间空间的ID和逻辑明文,得记忆的形ID CppSQLite3Query Result = LBrainQuery("*",CurrentRoomValue,LB_CHILD_ID,CurrentID); if(Result.eof())return 0; CurrentID = Result.getInt64Field(0); //fatherID if(CurrentID == ROOT_SPACE)break;; CurrentRoomValue = Result.getInt64Field(1); //fatherValuse MeaingList.push_front(CurrentRoomValue); } if (MeaingList.size()!=2) { return NULL; } int64 Type = MeaingList[0]; int64 ValueID = MeaingList[1]; Energy* E=NULL; switch(Type){ case TYPE_NULL: { E = new eNULL(); } break; case TYPE_INT: { E = new eINT(ValueID); } break; case TYPE_FLOAT: { assert(0); //暂且这样简化 E = new eFLOAT(ValueID); } break; case TYPE_STRING: { tstring s; if(!RetrieveText(ValueID,s,false)){ return NULL; } E = new eSTRING(s); } break; case TYPE_PIPELINE: { E = RetrievePipe(ValueID); } break; default: break; } return E; }
int32 CBrainMemory::RetrieveText(int64 MeaningID,tstring& Text,bool Nest){ int64 CurrentRoomValue,RoomType; int64 CurrentID = MeaningID; //首先得到意义空间的信息 if(!GetRoomInfo(MeaningID,CurrentRoomValue,RoomType))return 0; if(!Nest){ //首次外部调用时检查MeaningID代表记忆是否为可读的文字信息,嵌套调用则忽略 if(UnReadable(CurrentRoomValue))return 0; } //向上漫游,找到父空间空间的ID和逻辑明文,得记忆的形ID CppSQLite3Query Result = LBrainQuery("*",CurrentRoomValue,LB_CHILD_ID,CurrentID); if(Result.eof())return 0; CurrentID = Result.getInt64Field(0); if(CurrentID == ROOT_SPACE)return 0; CurrentRoomValue = Result.getInt64Field(1); //总是其他空间的空间识别ID //如果是字符,则可以确定所取文本应该是token int ch = IDToChar(CurrentRoomValue); if(isascii(ch)){ TCHAR buf[100]; //暂存token,一个单词99字符应该足够了 int p = 0; buf[p++] = ch; //继续向上漫游,应该全部都是字符 for(;;){ //根据本空间的ID和逻辑明文,找到父空间空间的ID和逻辑明文, CppSQLite3Query Result = LBrainQuery("*",CurrentRoomValue,LB_CHILD_ID,CurrentID); if(Result.eof())return 0; CurrentID = Result.getInt64Field(0); //如果得到的空间ID为根空间,则表示找到顶了。 if(CurrentID == ROOT_SPACE){ buf[p]='\0'; _tcsrev(buf); Text = buf; //如果是形容词则加上引号 if(RoomType == MEMORY_REFERENCE){ Text.insert(Text.begin(),1,_T('\"')); Text+=_T('\"'); } return 1; //表示得到一个token } CurrentRoomValue = Result.getInt64Field(1); if(p<100) buf[p++] = IDToChar(CurrentRoomValue); } } //不是字符,则需要嵌套处理,然后根据返回值添加标点符号 int32 n = 0; vector<tstring> StrList; for(;;){ tstring s; n = RetrieveText(CurrentRoomValue,s,false); StrList.push_back(s); //继续向上漫游,根据本空间的ID和逻辑明文,找到父空间空间的ID和逻辑明文, CppSQLite3Query Result = LBrainQuery("*",CurrentRoomValue,LB_CHILD_ID,CurrentID); if(Result.eof())return 0; CurrentID = Result.getInt64Field(0); //如果得到的空间ID为根空间,则表示找到顶了。 if(CurrentID == ROOT_SPACE)break; CurrentRoomValue = Result.getInt64Field(1); } TCHAR flag=_T(' '); if(n==1){ //子句,token之间应该有空格 flag = _T(' '); } else if(n==2){ //句子,子句之间有逗号 flag = _T(','); } else if(n ==3){ //段落,句子之间有句号 flag = _T('.'); } else if(n== 4){//文本,段落之间要分行 flag = _T('\n'); } assert(n<5); vector<tstring>::reverse_iterator It = StrList.rbegin(); while(It != StrList.rend()){ Text += *It; if(Text.size()){ TCHAR& ch = Text[Text.size()-1]; if(!ispunct(ch)){ Text += flag; }else if(Text.size()>2) { ch = Text[Text.size()-2]; if (isspace(ch)) { Text.erase(Text.size()-2,1); } } } It++; } if(RoomType == MEMORY_REFERENCE) { Text.insert(Text.begin(),1,_T('\"')); Text+='\"'; assert(n==1 || n==0); //引用被看作是一个token,应该只出现在子句里 return 1; } return ++n; }