📄 csdareamethod.cpp
字号:
}
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 + -