天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 83|回复: 0

AcDb3dSolid 对象 不等比例缩放

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
尝试将转换应用于新创建的 AcDb3dSolid 对象,如以下代码片段所示,遇到错误 Acad::eCannotScaleNonUniformly
试试下面的函数makeUniform(mat)。它使垫子均匀,同时尽可能多地保留其特性:

AcGeMatrix3d &makeUniformNoRounding(AcGeMatrix3d &mat);

// Make mat uniform
// Preserves:
//        + direction of the Z-axis
//        + ZX-plane
//  + "average" length of the base vectors
//  + all elements m[i][3] und m[3][j]
AcGeMatrix3d &makeUniform(AcGeMatrix3d &mat)
{
        // set values to 0 / 1 that only differ by 1e-12 from 0 / 1
        int i, j;
        double *dval;
        for (i = 0; i < 3; i++)
        {
                for (j = 0; j < 3; j++)
                {
                        dval = &(mat(i, j));
                        if (fabs(*dval) < 1e-12)
                                *dval = 0.0;
                        else if (fabs(*dval - 1.0) < 1e-6)
                                *dval = 1.0;
                }
                dval = &(mat(i, 3));
                if (fabs(*dval) < 1e-12)
                        *dval = 0.0;
        }
        makeUniformNoRounding(mat);
        return mat;
}

bool approx(const double &x1, const double &x2, const double &tol)
{
        int        exp1, exp2;
        double mant1 = frexp(x1, &exp1);
        double mant2 = frexp(x2, &exp2);

        if (abs(exp1 - exp2) > 1)
                return FALSE;        // exp1 > 2*exp2 or exp2 > 2*exp1
        else if (exp1 > exp2)
                mant2 *= 2;        // to same exponent
        else if (exp2 > exp1)
                mant1 *= 2;

        return (fabs(mant1 - mant2) < tol);
}

AcGeMatrix3d &makeUniformNoRounding(AcGeMatrix3d &mat)
{
        AcGePoint3d origin;
        AcGeVector3d eX, eY, eZ;
        mat.getCoordSystem(origin, eX, eY, eZ);
        bool bSetKoSys = false;
        double        spXY = eX.dotProduct(eY),
                spZX = eZ.dotProduct(eX),
                spYZ = eY.dotProduct(eZ);

        // make pairwise perpendicular
        if (spXY != 0.0 || spZX != 0.0 || spYZ != 0.0)
        {
                // keep eZ
                AcGeVector3d eZnorm(eZ), eYnorm;
                eZnorm.normalize();
                eX -= eZnorm * eX.dotProduct(eZnorm);

                // eX must be perpendicular to eY and eZ
                eYnorm = eX.crossProduct(eZnorm).normalize();
                double lY = eY.dotProduct(eYnorm);
                eY = lY * eYnorm;
                bSetKoSys = true;
        }
       
        double        slX = eX.dotProduct(eX), // = eX.lengthSqrd()
                slY = eY.dotProduct(eY),
                slZ = eZ.dotProduct(eZ);

        // make same length
        if (!approx(slX, slY, 1e-12) || !approx(slX, slZ, 1e-12))
        {
                double lav = sqrt((slX + slY + slZ) / 3.0); // average length
                eX.normalize(); eX *= lav;
                eY.normalize(); eY *= lav;
                eZ.normalize(); eZ *= lav;
                bSetKoSys = true;
        }

        if (bSetKoSys)
                mat.setCoordSystem(origin, eX, eY, eZ);

        return mat;
}

 

 

 

 

AcDb3dSolid 对象 不等比例缩放
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 10:31 , Processed in 0.114291 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表