示例#1
0
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;
}
示例#2
0
文件: BrainMemory.cpp 项目: GMIS/GMIS
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);
				}
			}
		}
	}
}
示例#3
0
// 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;
}
示例#4
0
文件: BrainMemory.cpp 项目: GMIS/GMIS
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;
}
示例#5
0
文件: BrainMemory.cpp 项目: GMIS/GMIS
//返回一个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;
}
示例#6
0
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;
}
示例#7
0
文件: BrainMemory.cpp 项目: GMIS/GMIS
//返回一段逻辑,表达为文字
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;
}
示例#8
0
文件: BrainMemory.cpp 项目: GMIS/GMIS
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;
}
示例#9
0
文件: BrainMemory.cpp 项目: GMIS/GMIS
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;
}