Line visibility in Freestyle

Blender version: The Freestyle branch revision 16866 (October 1, 2008)

Selection of visible and invisible lines

visibleline.py

import freestyle_init
from logical_operators import *
from PredicatesU1D import *
from shaders import *

upred = QuantitativeInvisibilityUP1D(0)
Operators.select(upred)
Operators.bidirectionalChain(ChainSilhouetteIterator(), NotUP1D(upred))
shaders_list = [
    ConstantColorShader(0, 0, 0),
    ConstantThicknessShader(2),
    ]
Operators.create(TrueUP1D(), shaders_list)

hiddenline1.py

import freestyle_init
from logical_operators import *
from PredicatesB1D import *
from PredicatesU1D import *
from shaders import *
from dashded_line import pyDashedLineShader

upred = NotUP1D(QuantitativeInvisibilityUP1D(0))
Operators.select(upred)
Operators.bidirectionalChain(ChainSilhouetteIterator(), NotUP1D(upred))
Operators.sequentialSplit(TrueUP0D(), 1.0) # for pyDashedLineShader
shaders_list = [
    pyDashedLineShader(fg=(.7, .7, .7)),
    ConstantThicknessShader(2),
    ]
Operators.create(TrueUP1D(), shaders_list)

hiddenline2.py

import freestyle_init
from logical_operators import *
from PredicatesB1D import *
from PredicatesU1D import *
from shaders import *
from dashded_line import pyDashedLineShader

upred = QuantitativeInvisibilityUP1D(1)
Operators.select(upred)
Operators.bidirectionalChain(ChainSilhouetteIterator(), NotUP1D(upred))
Operators.sequentialSplit(TrueUP0D(), 1.0) # for pyDashedLineShader
shaders_list = [
    pyDashedLineShader(fg=(.7, .7, .7)),
    ConstantThicknessShader(2),
    ]
Operators.create(TrueUP1D(), shaders_list)

Results

visibleline.py + hiddenline1.py

visibleline.py + hiddenline2.py

Appendix: dashed_line.py

import freestyle_init
from logical_operators import *
from PredicatesU1D import *
from shaders import *

def preset_pattern_1(n):
    return n % 10 <= 5

def preset_pattern_2(n):
    return n % 16 in [0, 1, 2, 3, 4, 5, 10, 11]

class pyDashedLineShader(StrokeShader):
    def __init__(self, pattern=preset_pattern_1, fg=(0, 0, 0), bg=(1, 1, 1)):
        StrokeShader.__init__(self)
        self.pattern = pattern
        self.fg = fg
        self.bg = bg
    def getName(self):
        return self.__class__.__name__
    def shade(self, stroke):
        it = stroke.strokeVerticesBegin()
        if self.pattern(stroke.getId().getSecond()):
            color = self.fg
        else:
            color = self.bg
        while it.isEnd() == 0:
            att = it.getObject().attribute()
            att.setColor(*color)
            it.increment()

if __name__ == "__main__":
    upred = QuantitativeInvisibilityUP1D(0)
    Operators.select(upred)
    Operators.bidirectionalChain(ChainSilhouetteIterator(), NotUP1D(upred))
    Operators.sequentialSplit(TrueUP0D(), 1.0) # for pyDashedLineShader
    shaders_list = [
        pyDashedLineShader(fg=(1, 0, 0)),
        ConstantThicknessShader(2),
        ]
    Operators.create(TrueUP1D(), shaders_list)