/* --------------------------------------------------------------------------- * inserts a point into a polygon */ static void * InsertPointIntoPolygon (LayerTypePtr Layer, PolygonTypePtr Polygon) { PointType save; Cardinal n; LineType line; if (!Forcible) { /* * first make sure adding the point is sensible */ line.Thickness = 0; line.Point1 = Polygon->Points[prev_contour_point (Polygon, InsertAt)]; line.Point2 = Polygon->Points[InsertAt]; if (IsPointOnLine ((float) InsertX, (float) InsertY, 0.0, &line)) return (NULL); } /* * second, shift the points up to make room for the new point */ ErasePolygon (Polygon); r_delete_entry (Layer->polygon_tree, (BoxTypePtr) Polygon); save = *CreateNewPointInPolygon (Polygon, InsertX, InsertY); for (n = Polygon->PointN - 1; n > InsertAt; n--) Polygon->Points[n] = Polygon->Points[n - 1]; /* Shift up indices of any holes */ for (n = 0; n < Polygon->HoleIndexN; n++) if (Polygon->HoleIndex[n] > InsertAt || (InsertLast && Polygon->HoleIndex[n] == InsertAt)) Polygon->HoleIndex[n]++; Polygon->Points[InsertAt] = save; SetChangedFlag (true); AddObjectToInsertPointUndoList (POLYGONPOINT_TYPE, Layer, Polygon, &Polygon->Points[InsertAt]); SetPolygonBoundingBox (Polygon); r_insert_entry (Layer->polygon_tree, (BoxType *) Polygon, 0); InitClip (PCB->Data, Layer, Polygon); if (Forcible || !RemoveExcessPolygonPoints (Layer, Polygon)) { DrawPolygon (Layer, Polygon, 0); Draw (); } return (&Polygon->Points[InsertAt]); }
// 查找同轴的组 int CSDMdlMachLongAxisCheck::FindSameAxis(const SDC_SurfaceData &surfData, const AxisDataArray &arrAxisData) { int nFind = -1; for (int i=0; i<arrAxisData.GetSize(); i++) { if (!IsPointOnLine(SVDOUBLE3(arrAxisData[i].axisStart), SVDOUBLE3(arrAxisData[i].axisVector), SVDOUBLE3(surfData.origin))) continue; if (IsVecSameDir(SVDOUBLE3(arrAxisData[i].axisVector), SVDOUBLE3(surfData.axisVector)) || IsVecReverseDir(SVDOUBLE3(arrAxisData[i].axisVector), SVDOUBLE3(surfData.axisVector))) { nFind = i; break; } } return nFind; }
static int rat_callback (const BoxType * box, void *cl) { LineTypePtr line = (LineTypePtr) box; struct ans_info *i = (struct ans_info *) cl; if (TEST_FLAG (i->locked, line)) return 0; if (TEST_FLAG (VIAFLAG, line) ? (Distance (line->Point1.X, line->Point1.Y, PosX, PosY) <= line->Thickness * 2 + SearchRadius) : IsPointOnLine (PosX, PosY, SearchRadius, line)) { *i->ptr1 = *i->ptr2 = *i->ptr3 = line; longjmp (i->env, 1); } return 0; }
static int line_callback (const BoxType * b, void *cl) { LineTypePtr line = (LineTypePtr) b; struct line_info *i = (struct line_info *) cl; if (line->Point1.X == i->X1 && line->Point2.X == i->X2 && line->Point1.Y == i->Y1 && line->Point2.Y == i->Y2) { i->ans = (LineTypePtr) (-1); longjmp (i->env, 1); } /* check the other point order */ if (line->Point1.X == i->X1 && line->Point2.X == i->X2 && line->Point1.Y == i->Y1 && line->Point2.Y == i->Y2) { i->ans = (LineTypePtr) (-1); longjmp (i->env, 1); } if (line->Point2.X == i->X1 && line->Point1.X == i->X2 && line->Point2.Y == i->Y1 && line->Point1.Y == i->Y2) { i->ans = (LineTypePtr) - 1; longjmp (i->env, 1); } /* remove unnecessary line points */ if (line->Thickness == i->Thickness /* don't merge lines if the clear flags differ */ && TEST_FLAG (CLEARLINEFLAG, line) == TEST_FLAG (CLEARLINEFLAG, i)) { if (line->Point1.X == i->X1 && line->Point1.Y == i->Y1) { i->test.Point1.X = line->Point2.X; i->test.Point1.Y = line->Point2.Y; i->test.Point2.X = i->X2; i->test.Point2.Y = i->Y2; if (IsPointOnLine ((float) i->X1, (float) i->Y1, 0.0, &i->test)) { i->ans = line; longjmp (i->env, 1); } } else if (line->Point2.X == i->X1 && line->Point2.Y == i->Y1) { i->test.Point1.X = line->Point1.X; i->test.Point1.Y = line->Point1.Y; i->test.Point2.X = i->X2; i->test.Point2.Y = i->Y2; if (IsPointOnLine ((float) i->X1, (float) i->Y1, 0.0, &i->test)) { i->ans = line; longjmp (i->env, 1); } } else if (line->Point1.X == i->X2 && line->Point1.Y == i->Y2) { i->test.Point1.X = line->Point2.X; i->test.Point1.Y = line->Point2.Y; i->test.Point2.X = i->X1; i->test.Point2.Y = i->Y1; if (IsPointOnLine ((float) i->X2, (float) i->Y2, 0.0, &i->test)) { i->ans = line; longjmp (i->env, 1); } } else if (line->Point2.X == i->X2 && line->Point2.Y == i->Y2) { i->test.Point1.X = line->Point1.X; i->test.Point1.Y = line->Point1.Y; i->test.Point2.X = i->X1; i->test.Point2.Y = i->Y1; if (IsPointOnLine ((float) i->X2, (float) i->Y2, 0.0, &i->test)) { i->ans = line; longjmp (i->env, 1); } } } return 0; }
// 检查开始,传出检查结果 int CSDMdl505PolarCheck::CheckAction(void *pData, const CheckRule &checkRule, CheckResult &checkResult) { checkRule; ProMdl pMdl = (ProMdl)pData; if (NULL == pMdl) { checkResult.nResultType = CHECK_RESULT_INVALID_MODEL; return checkResult.nResultType; } if (!IsMdlTypeValid(pMdl, checkRule.dwMdlFilter)) { checkResult.nResultType = CHECK_RESULT_INVALID_MODEL; return checkResult.nResultType; } // 获取坐标系对 CsysPolarVisitData visitData; visitData.pMdl = pMdl; visitData.bCheck1 = TRUE; ProSolidCsysVisit((ProSolid)pMdl, CsyVisitAction, NULL, &visitData); // 判断模型是否包含圆柱曲面 BOOL bFindCyl = FALSE; PolarCylVisitData cyldata; if (ProSolidSurfaceVisit(ProMdlToSolid(pMdl), SurfaceVisitAction, NULL, &cyldata) == PRO_TK_USER_ABORT) { bFindCyl = TRUE; } checkResult.arrErrorItems.RemoveAll(); ErrorItem item; for (int i=0; i<visitData.arrID1.GetCount(); i++) { ProCsys pCsy1, pCsy2; ProCsysInit(ProMdlToSolid(pMdl), visitData.arrID1[i], &pCsy1); ProCsysInit(ProMdlToSolid(pMdl), visitData.arrID2[i], &pCsy2); ProGeomitemdata* pcsyData1, *pcsyData2; ProCsysDataGet(pCsy1, &pcsyData1); ProCsysDataGet(pCsy2, &pcsyData2); SVDOUBLE3 vec0, vec1, vec2, pt1, pt2; vec0.x = pcsyData2->data.p_csys_data->origin[0]-pcsyData1->data.p_csys_data->origin[0]; vec0.y = pcsyData2->data.p_csys_data->origin[1]-pcsyData1->data.p_csys_data->origin[1]; vec0.z = pcsyData2->data.p_csys_data->origin[2]-pcsyData1->data.p_csys_data->origin[2]; vec1.x = pcsyData1->data.p_csys_data->z_vector[0]; vec1.y = pcsyData1->data.p_csys_data->z_vector[1]; vec1.z = pcsyData1->data.p_csys_data->z_vector[2]; vec2.x = pcsyData2->data.p_csys_data->z_vector[0]; vec2.y = pcsyData2->data.p_csys_data->z_vector[1]; vec2.z = pcsyData2->data.p_csys_data->z_vector[2]; pt1.x = pcsyData1->data.p_csys_data->origin[0]; pt1.y = pcsyData1->data.p_csys_data->origin[1]; pt1.z = pcsyData1->data.p_csys_data->origin[2]; pt2.x = pcsyData2->data.p_csys_data->origin[0]; pt2.y = pcsyData2->data.p_csys_data->origin[1]; pt2.z = pcsyData2->data.p_csys_data->origin[2]; ProGeomitemdataFree(&pcsyData1); ProGeomitemdataFree(&pcsyData2); BPVec3Normalize(&vec0, &vec0); BPVec3Normalize(&vec1, &vec1); BPVec3Normalize(&vec2, &vec2); // 检查是否指向模型本体外 double dRadian = BPCalcArcCos(BPVec3Dot(vec0, vec1)); if (!ISDNEAR(dRadian, 1.5707964) && dRadian < 1.5707964) { item.nID = visitData.arrID1[i]; item.nType = PRO_CSYS; item.pOwner = pMdl; item.strItemName = visitData.arrCsysName[i] + L"1"; checkResult.arrErrorItems.Add(item); } else if (bFindCyl) // 检查是否同轴 { if ((!IsVecSameDir(vec1, cyldata.line) && !IsVecReverseDir(vec1, cyldata.line)) || !IsPointOnLine(pt1, vec1, cyldata.pt)) { item.nID = visitData.arrID1[i]; item.nType = PRO_CSYS; item.pOwner = pMdl; item.strItemName = visitData.arrCsysName[i] + L"1"; checkResult.arrErrorItems.Add(item); } } dRadian = BPCalcArcCos(BPVec3Dot(vec0, vec2)); if (!ISDNEAR(dRadian, 1.5707964) && dRadian > 1.5707964) { item.nID = visitData.arrID2[i]; item.nType = PRO_CSYS; item.pOwner = pMdl; item.strItemName = visitData.arrCsysName[i] + L"2"; checkResult.arrErrorItems.Add(item); } else if (bFindCyl) { if ((!IsVecSameDir(vec2, cyldata.line) && !IsVecReverseDir(vec2, cyldata.line)) || !IsPointOnLine(pt2, vec2, cyldata.pt)) { item.nID = visitData.arrID2[i]; item.nType = PRO_CSYS; item.pOwner = pMdl; item.strItemName = visitData.arrCsysName[i] + L"2"; checkResult.arrErrorItems.Add(item); } } } if (checkResult.arrErrorItems.GetCount() > 0) checkResult.nResultType = CHECK_RESULT_INVALID_VALUE; else checkResult.nResultType = CHECK_RESULT_NO_ERROR; return checkResult.nResultType; }