// -----------------------------------------------------------------------------
// PrintElementInfo
//
//  print reservation information of a given element
// -----------------------------------------------------------------------------
static void		PrintElementInfo (const GS::HashTable<short, API_UserInfo>&	userInfoTable,
								  short										myUserId,
								  const char*								actionStr,
								  const API_Guid&							guid,
								  short										elementOwnerId = 0)
{
	API_Elem_Head elemHead;
	BNZeroMemory (&elemHead, sizeof (API_Elem_Head));
	elemHead.guid = guid;

	if (ACAPI_Element_GetHeader (&elemHead) == NoError) {
		GS::UniString elemTypeName;
		ACAPI_Goodies (APIAny_GetElemTypeNameID, (void*) elemHead.typeID, &elemTypeName);

		GS::UniString actionByUserStr (actionStr);
		if (userInfoTable.ContainsKey (elementOwnerId)) {
			if (elementOwnerId == myUserId) {
				actionByUserStr.Append (" by me (");
				actionByUserStr.Append (userInfoTable[elementOwnerId].fullName);
				actionByUserStr.Append (")");
			} else {
				actionByUserStr.Append (" by ");
				actionByUserStr.Append (userInfoTable[elementOwnerId].fullName);
			}
		}

		const GS::UniString reportString = GS::UniString::Printf ("=  %T {%T} is %T", elemTypeName.ToPrintf (), APIGuidToString (guid).ToPrintf (), actionByUserStr.ToPrintf ());
		ACAPI_WriteReport (reportString.ToCStr ().Get (), false);
	}
}		/* PrintElementInfo */
API_ElemTypeID	Neig_To_ElemID (API_NeigID neigID)
{
	API_ElemTypeID	typeID;
	GSErrCode		err;

	err = ACAPI_Goodies (APIAny_NeigIDToElemTypeID, &neigID, &typeID);
	if (err != NoError)
		typeID = API_ZombieElemID;

	return typeID;
}		// Neig_To_ElemID
static void		ModifyParams (const TextParams		*textPars,
							  const TextParamsInd	*parHdlInd,
							  GSHandle				parHdl)
{
	API_MDCLParameter	par;
	GSErrCode			err = NoError;

	if (parHdlInd->penInd != 0) {
		BNZeroMemory (&par, sizeof (API_MDCLParameter));
		par.index	= parHdlInd->penInd;
		par.type	= MDCLPar_int;
		par.int_par	= textPars->pen;
		err = ACAPI_Goodies (APIAny_ChangeMDCLParameterID, parHdl, &par);
	}

	if (err == NoError && parHdlInd->sizeInd != 0) {
		BNZeroMemory (&par, sizeof (API_MDCLParameter));
		par.index		= parHdlInd->sizeInd;
		par.type		= MDCLPar_float;
		par.float_par	= textPars->size;
		err = ACAPI_Goodies (APIAny_ChangeMDCLParameterID, parHdl, &par);
	}

	if (err == NoError && parHdlInd->contentInd != 0) {
		BNZeroMemory (&par, sizeof (API_MDCLParameter));
		par.index		= parHdlInd->contentInd;
		par.type		= MDCLPar_string;
		par.string_par	= textPars->content;
		err = ACAPI_Goodies (APIAny_ChangeMDCLParameterID, parHdl, &par);
	}

	if (err != NoError)
		ErrorBeep ("APIAny_ChangeMDCLParameterID", err);

	return;
}		// ModifyParams
Esempio n. 4
0
void highlightElementByID(){
	GSErrCode err;
	API_NeigID neigID;
	API_Element element;
	elementidlist eleMsg;
	API_StoryCmdType	storyCmd;
	char buffer[256];

	readDelimitedFrom(getClientSocket(), &eleMsg);

	Int32 nItem = eleMsg.guid_size();
	bool add = true;

	//Clear all selected elements
	err = ACAPI_Element_Select(NULL, 0, add);

	API_Neig** neigHdl = reinterpret_cast<API_Neig**> (BMAllocateHandle(nItem * sizeof(API_Neig), ALLOCATE_CLEAR, 0));

	API_Neig neig;
	for (int i = 0; i < nItem; i++){
		BNZeroMemory(&element, sizeof(API_Element));
		element.header.guid = APIGuidFromString(eleMsg.guid(i).c_str());
		err = ACAPI_Element_Get(&element);
		if (err != NoError) {
			sprintf(buffer, ErrID_To_Name(err));
			ACAPI_WriteReport(buffer, true);
			return;
		}
		err = ACAPI_Goodies(APIAny_ElemTypeToNeigID, (void*)element.header.typeID, &neigID);

		(*neigHdl)[i].neigID = neigID;
		(*neigHdl)[i].guid = element.header.guid;
		(*neigHdl)[i].flags = API_NeigFlg_Normal;
		(*neigHdl)[i].elemPartType = APINeigElemPart_None;
	}

	//Add the current element to the selection
	err = ACAPI_Element_Select(neigHdl, nItem, add);
	if (err != NoError) {
		sprintf(buffer, ErrID_To_Name(err));
		ACAPI_WriteReport(buffer, true);
		return;
	}

	BMhKill((GSHandle*)&neigHdl);

	/*
	* In order for the GUI update, we need to create an element, and then
	* delete it.
	* By doing this we can have the selected element highlighted
	*/

	API_Element		wallElement;
	API_ElementMemo memo;
	BNZeroMemory(&memo, sizeof(API_ElementMemo));

	BNZeroMemory(&wallElement, sizeof(API_Element));

	wallElement.header.typeID = API_WallID;
	wallElement.header.layer = 1;

	err = ACAPI_Element_GetDefaults(&wallElement, &memo);
	if (err != NoError) {
		ErrorBeep("ACAPI_Element_GetMemo", err);
		return;
	}

	err = ACAPI_Element_Create(&wallElement, &memo);

	if (err != NoError){
		ErrorBeep("ACAPI_Element_Create", err);
		sprintf(buffer, ErrID_To_Name(err));
		ACAPI_WriteReport(buffer, true);
	}

	ACAPI_DisposeElemMemoHdls(&memo);

	API_Elem_Head* test;
	test = &wallElement.header;
	ACAPI_Element_Delete(&test, 1);

}
Esempio n. 5
0
void getWalls(){
	API_Element element;
	GSErrCode err;
	char buffer[256];
	getwallmsg msg;
	wallmsg* aux;
	pointsmessage* pts;
	polyarcsmessage* arcs;

	GS::Array<API_Guid> elemList;
	ACAPI_Element_GetElemList(API_WallID, &elemList);

	for (GS::Array<API_Guid>::ConstIterator it = elemList.Enumerate(); it != NULL; ++it) {
		BNZeroMemory(&element, sizeof(API_Element));
		element.header.guid = *it;
		err = ACAPI_Element_Get(&element);
		if (err == NoError) {
			double x0 = element.wall.begC.x;
			double y0 = element.wall.begC.y;
			double x1 = element.wall.endC.x;
			double y1 = element.wall.endC.y;
			
			char s[256];
			APIGuid2GSGuid(element.header.guid).ConvertToString(s);
			msg.add_guid(s);

			aux = msg.add_walls();

			aux->set_bottomindex(element.header.floorInd);
			aux->set_thickness(element.wall.thickness);
			aux->set_upperindex(element.header.floorInd + 1);
			
			std::string materialName;

			if (element.wall.modelElemStructureType == API_BasicStructure){
				materialName = searchBuildingMaterialsValue(element.wall.buildingMaterial);
				aux->set_type("Basic");
			}
			else{
				materialName = searchCompositeMaterialsValue(element.wall.composite);
				aux->set_type("Composite");
			}

			if (materialName == "Not Found"){
				sprintf(buffer, "Found no material %d", element.wall.buildingMaterial);
				ACAPI_WriteReport(buffer, true);
			}
			else{
				aux->set_material(materialName);
			}

			if (element.wall.referenceLineLocation == APIWallRefLine_Center ||
				element.wall.referenceLineLocation == APIWallRefLine_CoreCenter){
				aux->set_referenceline("Center");
			}
			else if (element.wall.referenceLineLocation == APIWallRefLine_Outside ||
				element.wall.referenceLineLocation == APIWallRefLine_CoreOutside){
				aux->set_referenceline("Outside");
			}
			else if (element.wall.referenceLineLocation == APIWallRefLine_Inside ||
				element.wall.referenceLineLocation == APIWallRefLine_CoreInside){
				aux->set_referenceline("Inside");
			}
			else{
				sprintf(buffer, "Found no referenceLine %d", element.wall.buildingMaterial);
				ACAPI_WriteReport(buffer, true);
			}

			aux->set_alphaangle(element.wall.slantAlpha);
			aux->set_betaangle(element.wall.slantBeta);

			aux->set_profilename("");
			if (element.wall.profileType == APISect_Normal){
				aux->set_typeprofile("Normal");
			}
			else if (element.wall.profileType == APISect_Slanted){
				aux->set_typeprofile("Slanted");
			}
			else if (element.wall.profileType == APISect_Trapez){
				aux->set_typeprofile("DoubleSlanted");
			}
			else if (element.wall.profileType == APISect_Poly){
				aux->set_typeprofile("Poly");
				aux->set_profilename(searchProfileName(element.wall.profileAttr)); 
			}

			aux->set_height(element.wall.height);

			pts = new pointsmessage();
			pts->add_px(x0);
			pts->add_py(y0);
			pts->add_pz(0);
			pts->add_px(x1);
			pts->add_py(y1);
			pts->add_pz(0);
			aux->set_allocated_pts(pts);
			
			arcs = new polyarcsmessage();
			arcs->add_arcangle(element.wall.angle);
			arcs->add_begindex(0);
			arcs->add_endindex(1);
			aux->set_allocated_arcs(arcs);
			
			aux->set_flipped(!element.wall.flipped);

			aux->set_bottomoffset(element.wall.bottomOffset);
			
			aux->set_refoffset(element.wall.offset);

			if (element.wall.oppMat.overrideMaterial){
				aux->set_oppmat(searchOverrideMaterialsValue(element.wall.oppMat.material));
			}
			else{
				aux->set_oppmat("");
			}
			if (element.wall.refMat.overrideMaterial){
				aux->set_refmat(searchOverrideMaterialsValue(element.wall.refMat.material));
			}
			else{
				aux->set_refmat("");
			}
			if (element.wall.sidMat.overrideMaterial){
				aux->set_sidmat(searchOverrideMaterialsValue(element.wall.sidMat.material));
			}
			else{
				aux->set_sidmat("");
			}

			/*
			API_Attribute attr;
			attr.header.typeID = API_LayerID;
			attr.header.index = 1;
			err = ACAPI_Attribute_Get(&attr);
			if (hasError(err)){
				quit();
				return;
			}
			
			msgArchiCAD(attr.layer.head.name);
			aux->set_layer(attr.header.name);
			*/
			aux->set_layer(searchLayers(element.header.layer));

			GS::Array<API_Guid> windowList;
			ACAPI_Element_GetElemList(API_WindowID, &windowList);
			API_Element wElement;
			for (GS::Array<API_Guid>::ConstIterator it2 = windowList.Enumerate(); it2 != NULL; ++it2) {
				BNZeroMemory(&wElement, sizeof(API_Element));
				wElement.header.guid = *it2;
				err = ACAPI_Element_Get(&wElement);
				if (hasError(err)){
					quit();
					return;
				}
				if (wElement.window.owner == element.header.guid){
					windowmessage* wmsg = aux->add_windows();
					wmsg->set_height(wElement.window.openingBase.height);
					wmsg->set_width(wElement.window.openingBase.width);
					wmsg->set_objloc(wElement.window.objLoc);
					wmsg->set_zpos(wElement.window.lower);
					wmsg->set_guid(s);
					wmsg->set_name(searchObjectsValue(wElement.window.openingBase.libInd));
					wmsg->set_depthoffset(wElement.window.revealDepthOffset);
					wmsg->set_flipx(wElement.window.openingBase.oSide);
					wmsg->set_flipy(wElement.window.openingBase.reflected);
						
					aux->add_windoworder(0);

					API_ParamOwnerType   paramOwner;
					API_GetParamsType    getParams;

					BNZeroMemory(&paramOwner, sizeof(API_ParamOwnerType));
					paramOwner.guid = wElement.header.guid;
					paramOwner.libInd = 0;
					paramOwner.typeID = wElement.header.typeID;

					BNZeroMemory(&getParams, sizeof(API_GetParamsType));

					err = ACAPI_Goodies(APIAny_OpenParametersID, &paramOwner, NULL);
					if (err == NoError) {
						err = ACAPI_Goodies(APIAny_GetActParametersID, &getParams, NULL);
						if (err == NoError) {
							additionalparams* wparams = new additionalparams();
							prepareParams(wparams, &paramOwner, &getParams);
							wmsg->set_allocated_params(wparams);
						}
					}
				}
			}
		}
		else{
			sprintf(buffer, ErrID_To_Name(err));
			ACAPI_WriteReport(buffer, true);
		}
	}

	writeDelimitedTo(getClientSocket(), msg);
}
bool	ClickAnElem (const char			*prompt,
					 API_ElemTypeID		needTypeID,
					 API_Neig			*neig /*= NULL*/,
					 API_ElemTypeID		*typeID /*= NULL*/,
					 API_Guid			*guid /*= NULL*/,
					 API_Coord3D		*c /*= NULL*/,
					 bool				ignorePartialSelection /*= true*/)
{
	API_GetPointType	pointInfo;
	API_ElemTypeID		clickedID;
	GSErrCode			err;

	BNZeroMemory (&pointInfo, sizeof (API_GetPointType));
	CHTruncate (prompt, pointInfo.prompt, sizeof (pointInfo.prompt));
	pointInfo.changeFilter = false;
	pointInfo.changePlane  = false;
	err = ACAPI_Interface (APIIo_GetPointID, &pointInfo, NULL);
	if (err != NoError) {
		if (err != APIERR_CANCEL)
			WriteReport_Alert ("Error in APIIo_GetPointID: %d", err);
		return false;
	}

	if (pointInfo.neig.neigID == APINeig_None) {		// try to find polygonal element clicked inside the polygon area
		API_Elem_Head elemHead;
		BNZeroMemory (&elemHead, sizeof (API_Elem_Head));
		API_ElemSearchPars	pars;
		BNZeroMemory (&pars, sizeof (API_ElemSearchPars));
		pars.typeID = needTypeID;
		pars.loc.x = pointInfo.pos.x;
		pars.loc.y = pointInfo.pos.y;
		pars.z = 1.00E6;
		pars.filterBits = APIFilt_OnVisLayer | APIFilt_OnActFloor;
		err = ACAPI_Goodies (APIAny_SearchElementByCoordID, &pars, &elemHead.guid);
		if (err == NoError) {
			elemHead.typeID = pars.typeID;
			ElemHead_To_Neig (&pointInfo.neig, &elemHead);
		}
	}

	if (pointInfo.neig.elemPartType != APINeigElemPart_None && ignorePartialSelection) {
		pointInfo.neig.elemPartType = APINeigElemPart_None;
		pointInfo.neig.elemPartIndex = 0;
	}

	clickedID = Neig_To_ElemID (pointInfo.neig.neigID);

	if (neig != NULL)
		*neig = pointInfo.neig;
	if (typeID != NULL)
		*typeID = clickedID;
	if (guid != NULL)
		*guid = pointInfo.neig.guid;
	if (c != NULL)
		*c = pointInfo.pos;

	if (clickedID == API_ZombieElemID)
		return false;

	bool good = (needTypeID == API_ZombieElemID || needTypeID == clickedID);

	if (!good && clickedID == API_SectElemID) {
		API_Element element;
		BNZeroMemory (&element, sizeof (API_Element));
		element.header.guid = pointInfo.neig.guid;
		if (ACAPI_Element_Get (&element) == NoError)
			good = (needTypeID == element.sectElem.parentID);
	}

	return good;
}		// ClickAnElem
static void		ProcessParams (TextParams		*textPars,
							   TextParamsInd	*parHdlInd,
							   GSHandle			parHdl)
{
	API_MDCLParameter	par;
	Int32				n, i;
	bool				unknown, badValue, badType;
	GSErrCode			err;

	WriteReport ("Passed parameters");

	if (parHdl == NULL) {
		WriteReport ("  [no params]");
		return;
	}

	err = ACAPI_Goodies (APIAny_GetMDCLParameterNumID, parHdl, &n);
	WriteReport ("  num: %d", n);

	for (i = 1; i <= n; i++) {
		BNZeroMemory (&par, sizeof (API_MDCLParameter));
		par.index = i;
		err = ACAPI_Goodies (APIAny_GetMDCLParameterID, parHdl, &par);
		if (err == NoError) {

			switch (par.type) {
				case MDCLPar_int:
						WriteReport ("  [%d]  (%s) \"%s\" %d",     i, "  int", par.name, par.int_par);
						break;
				case MDCLPar_pointer:
						WriteReport ("  [%d]  (%s) \"%s\" %p",     i, "  ptr", par.name, par.ptr_par);
						break;
				case MDCLPar_float:
						WriteReport ("  [%d]  (%s) \"%s\" %lf",    i, "float", par.name, par.float_par);
						break;
				case MDCLPar_string:
						WriteReport ("  [%d]  (%s) \"%s\" \"%s\"", i, "  str", par.name, par.string_par);
						break;
			}

			unknown  = false;
			badValue = false;
			badType  = false;

			if (CHEqualCStrings (par.name, "pen")) {
				if (par.type == MDCLPar_int) {
					if (par.int_par > 1 && par.int_par < 256)
						textPars->pen = (short) par.int_par;
					else
						badValue = true;
					parHdlInd->penInd = (short) i;
				} else
					badType = true;

			} else if (CHEqualCStrings (par.name, "size")) {
				if (par.type == MDCLPar_float) {
					if (par.float_par > 0.0001)
						textPars->size = par.float_par;
					else
						badValue = true;
					parHdlInd->sizeInd = (short) i;
				} else
					badType = true;

			} else if (CHEqualCStrings (par.name, "content")) {
				if (par.type == MDCLPar_string) {
					strncpy (textPars->content, par.string_par, 255);
					textPars->content [255] = '\0';
					parHdlInd->contentInd   = (short) i;
				} else
					badType = true;

			} else
				unknown = true;

			if (unknown)
				WriteReport ("       ## unknown parameter ##");
			if (badValue)
				WriteReport ("       ## bad value ##");
			if (badType)
				WriteReport ("       ## bad type ##");

		} else
			ErrorBeep ("APIAny_GetMDCLParameterID", err);
	}

	return;
}		// ProcessParams