Exemplo n.º 1
0
Arquivo: insert.c Projeto: thequux/pcb
/* ---------------------------------------------------------------------------
 * 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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
Arquivo: create.c Projeto: thequux/pcb
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;
}
Exemplo n.º 5
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;
}