예제 #1
0
        public override void Draw(CustomGraphics g)
        {
            double vl = Volts[V_L];
            double vr = Volts[V_R];
            double vs = Volts[V_S];

            setBbox(mPoint1, mPoint2, HS);
            draw2Leads();

            int divide = (int)(SEGMENTS * mPosition);

            if (ControlPanel.ChkUseAnsiSymbols.Checked)
            {
                /* draw zigzag */
                for (int i = 0; i != SEGMENTS; i++)
                {
                    double v = vl + (vs - vl) * i / divide;
                    if (i >= divide)
                    {
                        v = vs + (vr - vs) * (i - divide) / (SEGMENTS - divide);
                    }
                    drawLead(mPs1[i], mPs2[i]);
                }
            }
            else
            {
                /* draw rectangle */
                drawLead(mRect1[0], mRect2[0]);
                for (int i = 0, j = 1; i != SEGMENTS; i++, j++)
                {
                    double v = vl + (vs - vl) * i / divide;
                    if (i >= divide)
                    {
                        v = vs + (vr - vs) * (i - divide) / (SEGMENTS - divide);
                    }
                    drawLead(mRect1[j], mRect3[j]);
                    drawLead(mRect2[j], mRect4[j]);
                }
                drawLead(mRect1[SEGMENTS + 1], mRect2[SEGMENTS + 1]);
            }

            /* draw slider */
            drawLead(mPost3, mCorner2);
            drawLead(mCorner2, mArrowPoint);
            drawLead(mArrow1, mArrowPoint);
            drawLead(mArrow2, mArrowPoint);

            /* draw dot */
            mCurCount1 = updateDotCount(mCurrent1, mCurCount1);
            mCurCount2 = updateDotCount(mCurrent2, mCurCount2);
            mCurCount3 = updateDotCount(mCurrent3, mCurCount3);
            if (CirSim.Sim.DragElm != this)
            {
                drawDots(mPoint1, mMidPoint, mCurCount1);
                drawDots(mPoint2, mMidPoint, mCurCount2);
                drawDots(mPost3, mCorner2, mCurCount3);
                drawDots(mCorner2, mMidPoint, mCurCount3 + Utils.Distance(mPost3, mCorner2));
            }
            drawPosts();

            if (ControlPanel.ChkShowValues.Checked && mResistance1 > 0 && (mFlags & FLAG_SHOW_VALUES) != 0)
            {
                /* check for vertical pot with 3rd terminal on left */
                bool reverseY = (mPost3.X < mLead1.X && mLead1.X == mLead2.X);
                /* check for horizontal pot with 3rd terminal on top */
                bool reverseX = (mPost3.Y < mLead1.Y && mLead1.X != mLead2.X);
                /* check if we need to swap texts (if leads are reversed, e.g. drawn right to left) */
                bool rev = (mLead1.X == mLead2.X && mLead1.Y < mLead2.Y) || (mLead1.Y == mLead2.Y && mLead1.X > mLead2.X);

                /* draw units */
                string s1         = Utils.UnitText(rev ? mResistance2 : mResistance1, "");
                string s2         = Utils.UnitText(rev ? mResistance1 : mResistance2, "");
                int    txtHeightH = CustomGraphics.FontText.Height / 2;
                int    txtWidth1  = (int)g.GetTextSize(s1).Width;
                int    txtWidth2  = (int)g.GetTextSize(s2).Width;

                /* vertical? */
                if (mLead1.X == mLead2.X)
                {
                    g.DrawLeftTopText(s1, !reverseY ? mArrowPoint.X : mArrowPoint.X - txtWidth1, Math.Min(mArrow1.Y, mArrow2.Y) + 4 * txtHeightH);
                    g.DrawLeftTopText(s2, !reverseY ? mArrowPoint.X : mArrowPoint.X - txtWidth2, Math.Max(mArrow1.Y, mArrow2.Y) - txtHeightH);
                }
                else
                {
                    g.DrawLeftTopText(s1, Math.Min(mArrow1.X, mArrow2.X) - txtWidth1, !reverseX ? (mArrowPoint.Y + txtHeightH + 10) : mArrowPoint.Y);
                    g.DrawLeftTopText(s2, Math.Max(mArrow1.X, mArrow2.X), !reverseX ? (mArrowPoint.Y + txtHeightH + 10) : mArrowPoint.Y);
                }
            }
            if (ControlPanel.ChkShowName.Checked)
            {
                if (mNameV)
                {
                    g.DrawCenteredVText(ReferenceName, mNamePos.X, mNamePos.Y);
                }
                else
                {
                    g.DrawLeftText(ReferenceName, mNamePos.X, mNamePos.Y);
                }
            }
        }