⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csdareamethod.cpp

📁 能在MDT5/6环境下对已经存在地曲面进行全部和局部区域展开
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		}
		uvAv = AcGeNurbCurve3d(pntArr1);
		
		tmpC = uvAv.closestPointTo(data.oCenter);
		uvAv.isOn(tmpC,centerparam);
		//	centerparam = vc.paramOf(tmpC);
		uvAv.getInterval(intrvl);
		
		dist = uln*uln + vlp*vlp;
		dist = sqrt(dist);
		// 设置u参数展开计算值范围
		tmp = uvAv.paramAtLength(centerparam,dist,Adesk::kTrue);
		if (tmp==0) 
			tmp = intrvl.upperBound();
		data.oBaseSurf.isOn(uvAv.evalPoint(tmp),tParam2d);
		if (data.oEvalU.lowerBound() > tParam2d.x) {
			data.oEvalU.setLower(tParam2d.x);
		}
		if (data.oEvalV.upperBound() < tParam2d.y) {
			data.oEvalV.setUpper(tParam2d.y);
		}
	}
	// u线和v线角中分线, 左上上
	nU = int ((cparam.x-intX.lowerBound())/stepu);
	nV = int ((intY.upperBound()-cparam.y)/(stepv*2));
	len = nU>nV ? nV:nU;
	if (len) {
		pntArr1.setLogicalLength(0);
		for (i=0; i<len+1; i++) {
			param.set(cparam.x-i*stepu,cparam.y+i*stepv*2);
			pntArr1.append(data.oBaseSurf.evalPoint(param));
		}
		uvAv = AcGeNurbCurve3d(pntArr1);
		
		tmpC = uvAv.closestPointTo(data.oCenter);
		uvAv.isOn(tmpC,centerparam);
		//	centerparam = vc.paramOf(tmpC);
		uvAv.getInterval(intrvl);
		
		dist = uln*uln + vlp*vlp;
		dist = sqrt(dist);
		// 设置u参数展开计算值范围
		tmp = uvAv.paramAtLength(centerparam,dist,Adesk::kTrue);
		if (tmp==0) 
			tmp = intrvl.upperBound();
		data.oBaseSurf.isOn(uvAv.evalPoint(tmp),tParam2d);
		if (data.oEvalU.lowerBound() > tParam2d.x) {
			data.oEvalU.setLower(tParam2d.x);
		}
		if (data.oEvalV.upperBound() < tParam2d.y) {
			data.oEvalV.setUpper(tParam2d.y);
		}
	}
*/


	// u线和v线角中分线, 右上中
	nU = int ((intX.upperBound()-cparam.x)/stepu);
	nV = int ((intY.upperBound()-cparam.y)/stepv);
	len = nU>nV ? nV:nU;
	if (len) {
		pntArr1.setLogicalLength(0);
		for (i=0; i<len+1; i++) {
			param.set(cparam.x+i*stepu,cparam.y+i*stepv);
			pntArr1.append(data.oBaseSurf.evalPoint(param));
		}
		uvAv = AcGeNurbCurve3d(pntArr1);
		
		tmpC = uvAv.closestPointTo(data.oCenter);
		uvAv.isOn(tmpC,centerparam);
		//	centerparam = vc.paramOf(tmpC);
		uvAv.getInterval(intrvl);
		
		dist = ulp*ulp + vlp*vlp;
		dist = sqrt(dist);
		// 设置u参数展开计算值范围
		tmp = uvAv.paramAtLength(centerparam,dist,Adesk::kTrue);
		if (tmp==0) 
			tmp = intrvl.upperBound();
		data.oBaseSurf.isOn(uvAv.evalPoint(tmp),tParam2d);
		if (data.oEvalU.upperBound() < tParam2d.x) {
			data.oEvalU.setUpper(tParam2d.x);
		}
		if (data.oEvalV.upperBound() < tParam2d.y) {
			data.oEvalV.setUpper(tParam2d.y);
		}
	}
/*
	// u线和v线角中分线, 右上下
	nU = int ((intX.upperBound()-cparam.x)/(stepu*2));
	nV = int ((intY.upperBound()-cparam.y)/stepv);
	len = nU>nV ? nV:nU;
	if (len) {
		pntArr1.setLogicalLength(0);
		for (i=0; i<len+1; i++) {
			param.set(cparam.x+i*stepu*2,cparam.y+i*stepv);
			pntArr1.append(data.oBaseSurf.evalPoint(param));
		}
		uvAv = AcGeNurbCurve3d(pntArr1);
		
		tmpC = uvAv.closestPointTo(data.oCenter);
		uvAv.isOn(tmpC,centerparam);
		//	centerparam = vc.paramOf(tmpC);
		uvAv.getInterval(intrvl);
		
		dist = ulp*ulp + vlp*vlp;
		dist = sqrt(dist);
		// 设置u参数展开计算值范围
		tmp = uvAv.paramAtLength(centerparam,dist,Adesk::kTrue);
		if (tmp==0) 
			tmp = intrvl.upperBound();
		data.oBaseSurf.isOn(uvAv.evalPoint(tmp),tParam2d);
		if (data.oEvalU.upperBound() < tParam2d.x) {
			data.oEvalU.setUpper(tParam2d.x);
		}
		if (data.oEvalV.upperBound() < tParam2d.y) {
			data.oEvalV.setUpper(tParam2d.y);
		}
	}
	// u线和v线角中分线, 右上上
	nU = int ((intX.upperBound()-cparam.x)/stepu);
	nV = int ((intY.upperBound()-cparam.y)/(stepv*2));
	len = nU>nV ? nV:nU;
	if (len) {
		pntArr1.setLogicalLength(0);
		for (i=0; i<len+1; i++) {
			param.set(cparam.x+i*stepu,cparam.y+i*stepv*2);
			pntArr1.append(data.oBaseSurf.evalPoint(param));
		}
		uvAv = AcGeNurbCurve3d(pntArr1);
		
		tmpC = uvAv.closestPointTo(data.oCenter);
		uvAv.isOn(tmpC,centerparam);
		//	centerparam = vc.paramOf(tmpC);
		uvAv.getInterval(intrvl);
		
		dist = ulp*ulp + vlp*vlp;
		dist = sqrt(dist);
		// 设置u参数展开计算值范围
		tmp = uvAv.paramAtLength(centerparam,dist,Adesk::kTrue);
		if (tmp==0) 
			tmp = intrvl.upperBound();
		data.oBaseSurf.isOn(uvAv.evalPoint(tmp),tParam2d);
		if (data.oEvalU.upperBound() < tParam2d.x) {
			data.oEvalU.setUpper(tParam2d.x);
		}
		if (data.oEvalV.upperBound() < tParam2d.y) {
			data.oEvalV.setUpper(tParam2d.y);
		}
	}
*/


	// u线和v线角中分线, 右下中
	nU = int ((intX.upperBound()-cparam.x)/stepu);
	nV = int ((cparam.y-intY.lowerBound())/stepv);
	len = nU>nV ? nV:nU;
	if (len) {
		pntArr1.setLogicalLength(0);
		for (i=0; i<len+1; i++) {
			param.set(cparam.x+i*stepu,cparam.y-i*stepv);
			pntArr1.append(data.oBaseSurf.evalPoint(param));
		}
		uvAv = AcGeNurbCurve3d(pntArr1);
		
		tmpC = uvAv.closestPointTo(data.oCenter);
		uvAv.isOn(tmpC,centerparam);
		//	centerparam = vc.paramOf(tmpC);
		uvAv.getInterval(intrvl);
		
		dist = ulp*ulp + vln*vln;
		dist = sqrt(dist);
		// 设置u参数展开计算值范围
		tmp = uvAv.paramAtLength(centerparam,dist,Adesk::kTrue);
		if (tmp==0) 
			tmp = intrvl.upperBound();
		data.oBaseSurf.isOn(uvAv.evalPoint(tmp),tParam2d);
		if (data.oEvalU.upperBound() < tParam2d.x) {
			data.oEvalU.setUpper(tParam2d.x);
		}
		if (data.oEvalV.lowerBound() > tParam2d.y) {
			data.oEvalV.setLower(tParam2d.y);
		}
	}
/*
	// u线和v线角中分线, 右下上
	nU = int ((intX.upperBound()-cparam.x)/(stepu*2));
	nV = int ((cparam.y-intY.lowerBound())/stepv);
	len = nU>nV ? nV:nU;
	if (len) {
		pntArr1.setLogicalLength(0);
		for (i=0; i<len+1; i++) {
			param.set(cparam.x+i*stepu*2,cparam.y-i*stepv);
			pntArr1.append(data.oBaseSurf.evalPoint(param));
		}
		uvAv = AcGeNurbCurve3d(pntArr1);
		
		tmpC = uvAv.closestPointTo(data.oCenter);
		uvAv.isOn(tmpC,centerparam);
		//	centerparam = vc.paramOf(tmpC);
		uvAv.getInterval(intrvl);
		
		dist = ulp*ulp + vln*vln;
		dist = sqrt(dist);
		// 设置u参数展开计算值范围
		tmp = uvAv.paramAtLength(centerparam,dist,Adesk::kTrue);
		if (tmp==0) 
			tmp = intrvl.upperBound();
		data.oBaseSurf.isOn(uvAv.evalPoint(tmp),tParam2d);
		if (data.oEvalU.upperBound() < tParam2d.x) {
			data.oEvalU.setUpper(tParam2d.x);
		}
		if (data.oEvalV.lowerBound() > tParam2d.y) {
			data.oEvalV.setLower(tParam2d.y);
		}
	}
	// u线和v线角中分线, 右下下
	nU = int ((intX.upperBound()-cparam.x)/stepu);
	nV = int ((cparam.y-intY.lowerBound())/(stepv*2));
	len = nU>nV ? nV:nU;
	if (len) {
		pntArr1.setLogicalLength(0);
		for (i=0; i<len+1; i++) {
			param.set(cparam.x+i*stepu,cparam.y-i*stepv*2);
			pntArr1.append(data.oBaseSurf.evalPoint(param));
		}
		uvAv = AcGeNurbCurve3d(pntArr1);
		
		tmpC = uvAv.closestPointTo(data.oCenter);
		uvAv.isOn(tmpC,centerparam);
		//	centerparam = vc.paramOf(tmpC);
		uvAv.getInterval(intrvl);
		
		dist = ulp*ulp + vln*vln;
		dist = sqrt(dist);
		// 设置u参数展开计算值范围
		tmp = uvAv.paramAtLength(centerparam,dist,Adesk::kTrue);
		if (tmp==0) 
			tmp = intrvl.upperBound();
		data.oBaseSurf.isOn(uvAv.evalPoint(tmp),tParam2d);
		if (data.oEvalU.upperBound() < tParam2d.x) {
			data.oEvalU.setUpper(tParam2d.x);
		}
		if (data.oEvalV.lowerBound() > tParam2d.y) {
			data.oEvalV.setLower(tParam2d.y);
		}
	}
*/

	
/*
	param.set(data.oEvalU.lowerBound(),data.oEvalU.upperBound());
	param.set(data.oEvalV.lowerBound(),data.oEvalV.upperBound());
*/

	return true;
}


CSDAreaISO::CSDAreaISO()
{
	nTol = 100;
	bFullD = true;
	bAutoOCenter = true;
	bDevInner = true;
	dCenterZ = 0.0;
	nU = 40;
	nV = 40;
	dTol = 0.001;
	nSingularity = 0;
//	bIsReversed = false;
}


CSDAreaISO::CSDAreaISO(CSDAreaISO& csdObj)
{
	*this = csdObj;
}


CSDAreaISO::~CSDAreaISO()
{
	oPntArr.setLogicalLength(0);
	dPntArr.setLogicalLength(0);
	pntArr1.setLogicalLength(0);
	pntArr2.setLogicalLength(0);
	oSurfLoops.setLogicalLength(0);
	dSurfLoops.setLogicalLength(0);
	oSurfTrimmedLoops2d.setLogicalLength(0);
}


bool CSDAreaISO::set(const CSDData& data)
{
	
	int num;
	num = data.oSurfLoops.length();

	if (!num) return false;
	int i;
	for (i=0; i<num; i++) {
		if (data.oSurfLoops[i].isEmpty())
			return false;
	}

	oBaseSurf = data.oBaseSurf;
	oSurfLoops = data.oSurfLoops;
	// nU,nV至少为2
	nU = (data.nU>1 ? data.nU:2);
	nV = (data.nV>1 ? data.nV:2);
	dCenter = data.dCenter;
	dCenterZ = data.dCenterZ;
	bFullD = data.bFullD;
	bDevInner = data.bDevInner;

	AcGeInterval intX,intY;
	oBaseSurf.getEnvelope(intX,intY);

		
	if (!bFullD) {
		oEvalU = data.oEvalU;
		oEvalV = data.oEvalV;
		
		if(oEvalU.lowerBound()<intX.lowerBound()) oEvalU.setLower(intX.lowerBound());
		if(oEvalU.upperBound()>intX.upperBound()) oEvalU.setUpper(intX.upperBound());
		
		if(oEvalV.lowerBound()<intY.lowerBound()) oEvalV.setLower(intY.lowerBound());
		if(oEvalV.upperBound()>intY.upperBound()) oEvalV.setUpper(intY.upperBound());
	} else {
		oEvalU = intX;
		oEvalV = intY;

	}

	bAutoOCenter = data.bAutoOCenter;
	if (!bAutoOCenter) {
		oCenter = oBaseSurf.closestPointTo(data.oCenter);
	}

	nTol = data.nTol;
//	bIsReversed = data.bIsReversed;

	// 展开计算
	eval();

	return true;

}


void CSDAreaISO::evalPnts()
{
	evalOParamLoops();
	evalOPnts();
	eval4PntsArdCenter();
	eval1stSecRow();
	eval2ndSecCol();
	eval3rdSecRow();
	eval4thSecCol();
	eval1stSecOth();
	eval2ndSecOth();
	eval3rdSecOth();
	eval4thSecOth();
	// 重合设置
	switch(nSingularity) {
	case 0:
		break;
	case 1:
		dSingularity = dPntArr[posCU*(nV+1)];
		break;
	case 2:
		dSingularity = dPntArr[nU*(nV+1)+posCV];
		break;
	case 3:
		dSingularity = dPntArr[posCU*(nV+1)+nV];
		break;
	case 4:
		dSingularity = dPntArr[posCV];
		break;
	}
	evalDPnts();
	evalTol();
}

void CSDAreaISO::evalOParamLoops()
{

	int i,ilen;
	ChGeLoop2dArray oSurfLoops2d;
	ilen = oSurfLoops.length();
	oSurfLoops2d.setLogicalLength(ilen);
	for (i=0; i<ilen; i++) {
		getParamsArrayFromPntsArray(
			oBaseSurf,oSurfLoops[i],oSurfLoops2d[i],true);
	}

	oSurfTrimmedLoops2d.setLogicalLength(0);

	ChGeLoop2d evalLoop;
	getLoopFromIntervalXY(oEvalU,oEvalV,evalLoop,nU,nV);

	if (bFullD) {
		oSurfLoops2d[0] = evalLoop;
		if (!bDevInner) { // 只展开外轮廓
			oSurfTrimmedLoops2d.append(oSurfLoops2d[0]);
		} else { 
			oSurfTrimmedLoops2d = oSurfLoops2d;
		}
	} else {
		// 计算展开区域轮廓
		AcDbRegion *pReg,*pOuterReg;
		Acad::ErrorStatus es;

		es = createRegion(evalLoop,pReg);

		if (createRegion(oSurfLoops2d[0],pOuterReg) != Acad::eOk) {
			// ? 在进行消声瓦敷设时用,得到的结果是基面上的结果
			oBaseSurf.getEnvelope(oEvalU,oEvalV);
			getLoopFromIntervalXY(oEvalU,oEvalV,oSurfLoops2d[0],nU,nV);
			es = createRegion(oSurfLoops2d[0],pOuterReg);

			AcGePoint2d cParam;
			cParam.x = ((oEvalU.lowerBound()+oEvalU.upperBound())/2);
			cParam.y = ((oEvalV.lowerBound()+oEvalV.upperBound())/2);
			oCenter = oBaseSurf.evalPoint(cParam);
		}

		es = pReg->booleanOper(AcDb::kBoolIntersect,pOuterReg);
		if (pReg->isNull()) return;

		if (bDevInner) {
			int i,len;
			len = oSurfLoops2d.length();
			AcDbRegion *pInnerReg;
			for (i=1; i<len; i++) {
				createRegion(oSurfLoops2d[i],pInnerReg);
				pReg->booleanOper(AcDb::kBoolSubtract,pInnerReg);
				if (pReg->isNull()) break;
			}
		}
		if (!pReg->isNull()) {
			ChGeLoop3dArray loops;
			acdbHostApplicationServices()->workingDatabase()->
				addAcDbObject(pReg);
			es = getLoopsFromRegion(pReg,loops);
			pReg->erase();
			pReg->close();
			Loops3dTo2d(loops,oSurfTrimmedLoops2d);
/*
			ilen = oSurfTrimmedLoops2d.length();
			int j,jlen,k,klen;
			for (i=ilen-1; i>-1; i--) {
				jlen = oSurfTrimmedLoops2d[i].length();
				for (j=jlen-1; j>-1; j--) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -