コード例 #1
0
ファイル: MenuHandler.cpp プロジェクト: ZuDame/Smart3DCoating
// 单侧放量
void OnOffsetSingleActFn()
{
	/*if (!QuickCheckValidLicense(SMART_PROFESSIONAL))
		return;*/

	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	DestroyAllDialog();
	CancelSelectDialog();
	Sleep(50);

	ProMdl pMdl = GetCurrentMdl();
	if (pMdl == NULL)
	{
		MessageBox(NULL, L"当前环境未发现模型!", L"提示", MB_OK|MB_ICONWARNING);
		return;
	}

	// 选择面
	vector<ProSelection> arrSelQlt;
	ShowMessageTip(L"Tips.选择要偏移的面...");
	if (SelectObject(arrSelQlt, "surface"))
	{
		// 输入偏离值
		double dOffset;
		ShowMessageTip(L"输入偏移量,不能为0,但可以为负值:");
		if (ProMessageDoubleRead(NULL, &dOffset) == PRO_TK_NO_ERROR)
		{
			// 判断面的方向
			ProModelitem itemSurf;
			ProSelectionModelitemGet(arrSelQlt[0], &itemSurf);
			ProSurface surf;
			ProGeomitemToSurface(&itemSurf, &surf);
			ProGeomitemdata* psrfdata;
			ProSurfaceDataGet(surf, &psrfdata);
			if (psrfdata->data.p_surface_data->orient == PRO_SURF_ORIENT_IN)
				dOffset = dOffset*(-1);
			ProGeomitemdataFree(&psrfdata);
			// 创建偏移特征
			int nOffsetID = OffsetSurfaceWithSide(pMdl, arrSelQlt[0], dOffset);
			if (nOffsetID > 0)
			{
				// 修改面颜色
				ProFeature feat;
				feat.id = nOffsetID;
				feat.type = PRO_FEATURE;
				feat.owner = pMdl;
				vector<ProModelitem> arrQuilts;
				ProFeatureGeomitemVisit(&feat, PRO_QUILT, FeatureGeomsGetAction, NULL, &arrQuilts);
				for (int i=0; i<arrQuilts.size(); i++)
					SetSurfColor(arrQuilts[i], 255, 215, 0);
			}
		}
	}
	InvalidateDrawing();
	ProMessageClear();
}
コード例 #2
0
void CSDMdlMachFlatBottomHoleCheck::GetPlaneSurfAxis(ProSurface Surf, double SurfAxis[])
{
	ProError status;
	ProGeomitemdata* GeoItemdata;
	status = ProSurfaceDataGet(Surf, &GeoItemdata);
	for (int i = 0; i< 3; i++)
	{
		SurfAxis[i] = (*GeoItemdata).data.p_surface_data->srf_shape.plane.e3[i];
	}
}
コード例 #3
0
// 获取模型中类轴曲面集_过滤函数
ProError CSDMdlMachLongAxisCheck::GetSldAxisSurfaceFilter(ProSurface pSurf, ProAppData pData)
{
    pData;

    ProGeomitemdata *pGeomData = NULL;
    ProSurfaceDataGet(pSurf, &pGeomData);
    ProError status = PRO_TK_CONTINUE;
    if (pGeomData->data.p_surface_data->type == PRO_SRF_CYL ||
            pGeomData->data.p_surface_data->type == PRO_SRF_CONE)
        status = PRO_TK_NO_ERROR;
    ProGeomitemdataFree(&pGeomData);

    return status;
}
コード例 #4
0
// 获取曲面数据
BOOL CSDMdlMachLongAxisCheck::SetSurfaceData(ProSurface pSurf, ProSurface pSameSurf, SDC_SurfaceData &surfData)
{
    if (NULL == pSurf)
        return FALSE;

    surfData.pSurface = pSurf;
    surfData.pSameSurf = pSameSurf;
    ProGeomitemdata *pGeomData = NULL;
    ProSurfaceDataGet(pSurf, &pGeomData);
    BOOL bRet = FALSE;
    if (pGeomData->data.p_surface_data->type == PRO_SRF_CYL)
    {
        VectorCopy(pGeomData->data.p_surface_data->srf_shape.cylinder.origin, surfData.origin);
        VectorCopy(pGeomData->data.p_surface_data->srf_shape.cylinder.e3, surfData.axisVector);
        VectorCopy(pGeomData->data.p_surface_data->xyz_min, surfData.minPt);
        VectorCopy(pGeomData->data.p_surface_data->xyz_max, surfData.maxPt);
        SVDOUBLE3 minProj, maxProj;
        ProjectPtToLine(SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.origin),
                        SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.e3), SVDOUBLE3(surfData.minPt), minProj);
        ProjectPtToLine(SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.origin),
                        SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.e3), SVDOUBLE3(surfData.maxPt), maxProj);
        surfData.dDiameter = pGeomData->data.p_surface_data->srf_shape.cylinder.radius * 2.0;
        SVDOUBLE3ToPoint3D(minProj, surfData.minPt);
        SVDOUBLE3ToPoint3D(maxProj, surfData.maxPt);
        bRet = TRUE;
    }
    else if (pGeomData->data.p_surface_data->type == PRO_SRF_CONE)
    {
        VectorCopy(pGeomData->data.p_surface_data->srf_shape.cone.origin, surfData.origin);
        VectorCopy(pGeomData->data.p_surface_data->srf_shape.cone.e3, surfData.axisVector);
        VectorCopy(pGeomData->data.p_surface_data->xyz_min, surfData.minPt);
        VectorCopy(pGeomData->data.p_surface_data->xyz_max, surfData.maxPt);
        SVDOUBLE3 minProj, maxProj;
        ProjectPtToLine(SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.origin),
                        SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.e3), SVDOUBLE3(surfData.minPt), minProj);
        ProjectPtToLine(SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.origin),
                        SVDOUBLE3(pGeomData->data.p_surface_data->srf_shape.cone.e3), SVDOUBLE3(surfData.maxPt), maxProj);
        double dR1 = CalculateDistance(SVDOUBLE3(surfData.minPt), SVDOUBLE3(minProj));
        double dR2 = CalculateDistance(SVDOUBLE3(surfData.maxPt), SVDOUBLE3(maxProj));
        surfData.dDiameter = dR1 < dR2 ? (dR1 * 2.0) : (dR2 * 2.0);
        VectorCopy(minProj, surfData.minPt);
        VectorCopy(maxProj, surfData.maxPt);
        bRet = TRUE;
    }
    ProGeomitemdataFree(&pGeomData);

    return TRUE;
}
コード例 #5
0
// 判断圆柱面或圆锥面的法向是否远离轴线
BOOL CSDMdlMachLongAxisCheck::IsSurfNormalAwayFromAxis(ProSurface pSurf)
{
    if (NULL == pSurf)
        return FALSE;

    ProGeomitemdata *pSurfData = NULL;
    ProSurfaceDataGet(pSurf, &pSurfData);
    BOOL bRet = FALSE;
    if (pSurfData->data.p_surface_data->type == PRO_SRF_CYL ||
            pSurfData->data.p_surface_data->type == PRO_SRF_CONE)
    {
        if (pSurfData->data.p_surface_data->orient == PRO_SURF_ORIENT_OUT)
            bRet = TRUE;
    }

    ProGeomitemdataFree(&pSurfData);
    return bRet;
}
コード例 #6
0
// 根据参数得到相邻的曲面
ProSurface CSDMdlMachLongAxisCheck::GetNeighborSurf(const SDC_SurfaceData &surfData, BOOL bIsMinPara)
{
    ProSurface pSurf = surfData.pSurface;
    ProSurface pNeighborSurf = NULL;
    ProGeomitemdata *pGeomData = NULL;
    ProSurfaceDataGet(pSurf, &pGeomData);

    ProEdge pCloseEdge = GetCloseEdge(bIsMinPara ? surfData.minPt : surfData.maxPt, pGeomData->data.p_surface_data->contour_arr);
    if (pCloseEdge != NULL)
    {
        ProEdge pEdge1, pEdge2;
        ProSurface pFace1, pFace2;
        ProEdgeNeighborsGet(pCloseEdge, &pEdge1, &pEdge2, &pFace1, &pFace2);
        if (pFace1 == pSurf)
            pNeighborSurf = pFace2;
        else
            pNeighborSurf = pFace1;
    }

    ProGeomitemdataFree(&pGeomData);
    return pNeighborSurf;
}
コード例 #7
0
ProError CSDMdl505PolarCheck::SurfaceVisitAction(ProSurface pSurf, ProError status, ProAppData pData)
{
	UNUSED_ALWAYS(status);

	PolarCylVisitData &visitData = *((PolarCylVisitData*)pData);

	ProGeomitemdata* pgdata;
	if (ProSurfaceDataGet(pSurf, &pgdata) == PRO_TK_NO_ERROR)
	{
		if (pgdata->data.p_surface_data->type == PRO_SRF_CYL)
		{
			visitData.line[0] = pgdata->data.p_surface_data->srf_shape.cylinder.e3[0];
			visitData.line[1] = pgdata->data.p_surface_data->srf_shape.cylinder.e3[1];
			visitData.line[2] = pgdata->data.p_surface_data->srf_shape.cylinder.e3[2];
			visitData.pt[0] = pgdata->data.p_surface_data->srf_shape.cylinder.origin[0];
			visitData.pt[1] = pgdata->data.p_surface_data->srf_shape.cylinder.origin[1];
			visitData.pt[2] = pgdata->data.p_surface_data->srf_shape.cylinder.origin[2];
			ProGeomitemdataFree(&pgdata);
			return PRO_TK_USER_ABORT;
		}
		ProGeomitemdataFree(&pgdata);
	}
	return PRO_TK_NO_ERROR;
}