Exemplo n.º 1
0
void RS_Arc::draw(RS_Painter* painter, RS_GraphicView* view,
                  double /*patternOffset*/) {

    if (painter==NULL || view==NULL) {
        return;
    }

    //double styleFactor = getStyleFactor();

    // simple style-less lines
    if (getPen().getLineType()==RS2::SolidLine ||
            isSelected() ||
            view->getDrawingMode()==RS2::ModePreview) {

        painter->drawArc(view->toGui(getCenter()),
                         getRadius() * view->getFactor().x,
                         getAngle1(), getAngle2(),
                         isReversed());
    } else {
        double styleFactor = getStyleFactor(view);
		if (styleFactor<0.0) {
        	painter->drawArc(view->toGui(getCenter()),
                         getRadius() * view->getFactor().x,
                         getAngle1(), getAngle2(),
                         isReversed());
			return;
		}

        // Pattern:
        RS_LineTypePattern* pat;
        if (isSelected()) {
            pat = &patternSelected;
        } else {
            pat = view->getPattern(getPen().getLineType());
        }

        if (pat==NULL) {
            return;
        }

        if (getRadius()<1.0e-6) {
            return;
        }

        // Pen to draw pattern is always solid:
        RS_Pen pen = painter->getPen();
        pen.setLineType(RS2::SolidLine);
        painter->setPen(pen);

        double a1;
        double a2;
        if (data.reversed) {
            a2 = getAngle1();
            a1 = getAngle2();
        } else {
            a1 = getAngle1();
            a2 = getAngle2();
        }

        double* da;     // array of distances in x.
        int i;          // index counter

        double length = getAngleLength();

        // create scaled pattern:
        da = new double[pat->num];

        for (i=0; i<pat->num; ++i) {
            da[i] = fabs(pat->pattern[i] * styleFactor) / getRadius();
        }

        double tot=0.0;
        i=0;
        bool done = false;
        double curA = a1;
        //double cx = getCenter().x * factor.x + offsetX;
        //double cy = - a->getCenter().y * factor.y + getHeight() - offsetY;
        RS_Vector cp = view->toGui(getCenter());
        double r = getRadius() * view->getFactor().x;

        do {
            if (pat->pattern[i] > 0.0) {
                if (tot+da[i]<length) {
                    painter->drawArc(cp, r,
                                     curA,
                                     curA + da[i],
                                     false);
                } else {
                    painter->drawArc(cp, r,
                                     curA,
                                     a2,
                                     false);
                }
            }
            curA+=da[i];
            tot+=da[i];
            done=tot>length;

            i++;
            if (i>=pat->num) {
                i=0;
            }
        } while(!done);

        delete[] da;
    }
}
Exemplo n.º 2
0
void RS_Ellipse::draw(RS_Painter* painter, RS_GraphicView* view, double patternOffset) {

    if (painter==NULL || view==NULL) {
        return;
    }


    if (getPen().getLineType()==RS2::SolidLine ||
            isSelected() ||
            view->getDrawingMode()==RS2::ModePreview) {

        painter->drawEllipse(view->toGui(getCenter()),
                             getMajorRadius() * view->getFactor().x,
                             getMinorRadius() * view->getFactor().x,
                             getAngle(),
                             getAngle1(), getAngle2(),
                             isReversed());
    } else {
    	double styleFactor = getStyleFactor(view);
		if (styleFactor<0.0) {
        	painter->drawEllipse(view->toGui(getCenter()),
                             getMajorRadius() * view->getFactor().x,
                             getMinorRadius() * view->getFactor().x,
                             getAngle(),
                             getAngle1(), getAngle2(),
                             isReversed());
			return;
		}
		
        // Pattern:
        RS_LineTypePattern* pat;
        if (isSelected()) {
            pat = &patternSelected;
        } else {
            pat = view->getPattern(getPen().getLineType());
        }

        if (pat==NULL) {
            return;
        }

        // Pen to draw pattern is always solid:
        RS_Pen pen = painter->getPen();
        pen.setLineType(RS2::SolidLine);
        painter->setPen(pen);

        double* da;     // array of distances in x.
        int i;          // index counter

        double length = getAngleLength();

        // create pattern:
        da = new double[pat->num];

        double tot=0.0;
        i=0;
        bool done = false;
        double curA = getAngle1();
        double curR;
        RS_Vector cp = view->toGui(getCenter());
        double r1 = getMajorRadius() * view->getFactor().x;
        double r2 = getMinorRadius() * view->getFactor().x;

        do {
            curR = sqrt(RS_Math::pow(getMinorRadius()*cos(curA), 2.0)
                        + RS_Math::pow(getMajorRadius()*sin(curA), 2.0));

            if (curR>1.0e-6) {
                da[i] = fabs(pat->pattern[i] * styleFactor) / curR;
                if (pat->pattern[i] * styleFactor > 0.0) {

                    if (tot+fabs(da[i])<length) {
                        painter->drawEllipse(cp,
                                             r1, r2,
                                             getAngle(),
                                             curA,
                                             curA + da[i],
                                             false);
                    } else {
                        painter->drawEllipse(cp,
                                             r1, r2,
                                             getAngle(),
                                             curA,
                                             getAngle2(),
                                             false);
                    }
                }
            }
            curA+=da[i];
            tot+=fabs(da[i]);
            done=tot>length;

            i++;
            if (i>=pat->num) {
                i=0;
            }
        } while(!done);

        delete[] da;
    }
}
Exemplo n.º 3
0
void RS_Line::draw(RS_Painter* painter, RS_GraphicView* view, double patternOffset)
{
  if (painter==NULL || view==NULL)
  {
    return;
  }

  if (getPen().getLineType()==RS2::SolidLine ||
      isSelected() ||
      view->getDrawingMode()==RS2::ModePreview)
  {

    painter->drawLine(view->toGui(getStartpoint()),
                      view->toGui(getEndpoint()));
  }
  else
  {
    double styleFactor = getStyleFactor(view);
    if (styleFactor<0.0)
    {
      painter->drawLine(view->toGui(getStartpoint()),
                        view->toGui(getEndpoint()));
      return;
    }

    // Pattern:
    RS_LineTypePattern* pat;
    if (isSelected())
    {
      pat = &patternSelected;
    }
    else
    {
      pat = view->getPattern(getPen().getLineType());
    }
    if (pat==NULL)
    {
      RS_DEBUG->print(RS_Debug::D_WARNING,
                      "RS_Line::draw: Invalid line pattern");
      return;
    }

    // Pen to draw pattern is always solid:
    RS_Pen pen = painter->getPen();

    pen.setLineType(RS2::SolidLine);
    painter->setPen(pen);

    // index counter
    int i;

    // line data:
    double length = getLength();
    double angle = getAngle1();

    // pattern segment length:
    double patternSegmentLength = 0.0;

    // create pattern:
    RS_Vector* dp = new RS_Vector[pat->num];

    for (i=0; i<pat->num; ++i)
    {
      dp[i] = RS_Vector(cos(angle) * fabs(pat->pattern[i] * styleFactor),
                        sin(angle) * fabs(pat->pattern[i] * styleFactor));

      patternSegmentLength += fabs(pat->pattern[i] * styleFactor);
    }

    // handle pattern offset:
    int m;
    if (patternOffset<0.0)
    {
      m = (int)ceil(patternOffset / patternSegmentLength);
    }
    else
    {
      m = (int)floor(patternOffset / patternSegmentLength);
    }

    patternOffset -= (m*patternSegmentLength);
    //if (patternOffset<0.0) {
    //  patternOffset+=patternSegmentLength;
    //}
    //RS_DEBUG->print("pattern. offset: %f", patternOffset);
    RS_Vector patternOffsetVec;
    patternOffsetVec.setPolar(patternOffset, angle);

    double tot=patternOffset;
    i=0;
    bool done = false;
    bool cutStartpoint, cutEndpoint, drop;
    RS_Vector curP=getStartpoint()+patternOffsetVec;

    do
    {
      cutStartpoint = false;
      cutEndpoint = false;
      drop = false;

      // line segment (otherwise space segment)
      if (pat->pattern[i]>0.0)
      {
        // drop the whole pattern segment line:
        if (tot+pat->pattern[i]*styleFactor < 0.0)
        {
          drop = true;
        }
        else
        {
          // trim startpoint of pattern segment line to line startpoint
          if (tot < 0.0)
          {
            cutStartpoint = true;
          }
          // trim endpoint of pattern segment line to line endpoint
          if (tot+pat->pattern[i]*styleFactor > length)
          {
            cutEndpoint = true;
          }
        }

        if (drop)
        {
          // do nothing
        }
        else
        {
          RS_Vector p1 = curP;
          RS_Vector p2 = curP + dp[i];

          if (cutStartpoint)
          {
            p1 = getStartpoint();
          }
          if (cutEndpoint)
          {
            p2 = getEndpoint();
          }

          painter->drawLine(view->toGui(p1),
                            view->toGui(p2));
        }
      }
      curP+=dp[i];
      tot+=fabs(pat->pattern[i]*styleFactor);
      //RS_DEBUG->print("pattern. tot: %f", tot);
      done=tot>length;

      i++;
      if (i>=pat->num)
      {
        i=0;
      }
    }
    while(!done);

    delete[] dp;

  }
}