Exemplo n.º 1
0
    def createInnerUi(self,parent):
        
        #container = BaseTab.createScrollLayout(parent)
        rows=cmds.columnLayout(parent=parent,
            adjustableColumn=1,rowSpacing=Constants.MARGIN_SPACING_VERTICAL,
            width=400)
        
        BaseTab.createFixedTitledRow(rows, "Influence names")
        self.chkLongNames = CheckBoxField(AddPairDialog.CTRL_PREFIX+'longNames',label="Longer, where ambiguous",annotation="Show long names in drop down boxes")
        self.chkLongNames.changeCommand.addHandler(self.updateInfluenceLabels)
        
        BaseTab.createFixedTitledRow(rows, "Source influence")
        
        
        self.sourceDropdown = DropDownField(self.sourceValue)

        BaseTab.createFixedTitledRow(rows, None)

        self.chkSelfReference = CheckBoxField(AddPairDialog.CTRL_PREFIX+'selfReference',label="Self reference",annotation="Don't map to another influence, mirror on the same influence")
        self.chkSelfReference.changeCommand.addHandler(self.updateEnabled)
        self.chkBidirectional = CheckBoxField(AddPairDialog.CTRL_PREFIX+'bidirectional',label="Bidirectional association")
            
 
        self.destinationRow = BaseTab.createTitledRow(rows, "Destination influence")
        self.destinationDropdown = DropDownField(self.destinationValue)
        
        self.updateEnabled()
        self.updateInfluenceLabels()
        self.sourceDropdown.updateModel()
        self.destinationDropdown.updateModel()
        return rows
Exemplo n.º 2
0
    def createInitializationGroup(self):
        group = self.createUIGroup(self.cmdLayout.innerLayout,
                                   'Initialization')

        self.createFixedTitledRow(group, 'Infl. Distance Error')
        self.controls.influenceDistanceError = FloatField(
            self.VAR_PREFIX + 'distanceError',
            minValue=0,
            maxValue=None,
            step=0.01,
            defaultValue=0.001,
            annotation=
            'Defines maximum inaccuracy between left and right influence positions'
        )

        self.createTitledRow(group, 'Influence Prefixes')
        self.controls.influencePrefixes = StoredTextEdit(
            self.VAR_PREFIX + 'inflPrefix',
            annotation=
            'Defines maximum inaccuracy between left and right influence positions'
        )

        self.createFixedTitledRow(group, 'Mirror Axis')
        cmds.columnLayout()
        self.controls.mirrorAxis = DropDownField(self.VAR_PREFIX +
                                                 'mirrorAxis')
        self.controls.mirrorAxis.beginRebuildItems()
        self.controls.mirrorAxis.addOption("X")
        self.controls.mirrorAxis.addOption("Y")
        self.controls.mirrorAxis.addOption("Z")
        self.controls.mirrorAxis.endRebuildItems()
Exemplo n.º 3
0
    def createTransferOptionsGroup(self):
        group = self.createUIGroup(self.cmdLayout.innerLayout,
                                   'Transfer Options')
        self.createTitledRow(parent=group, title="Vertex Transfer Mode")
        self.controls.transferMode = DropDownField(self.VAR_PREFIX +
                                                   'vertexTransferMode')

        for opt in CopyWeightsModel.vertexTransferModes.keys():
            self.controls.transferMode.addOption(opt)

        self.createTitledRow(parent=group, title="Influence namespaces")
        self.controls.ignoreNamespaces = CheckBoxField(
            self.VAR_PREFIX + 'IgnoreNamespaces',
            label="Ignore when matching by name",
            annotation='ignore when matching by name',
            defaultValue=1)
        self.controls.ignoreNamespaces.changeCommand.addHandler(
            self.previewInfluenceMapping, ownerUI=group)

        self.createTitledRow(parent=group, title=None)
        self.controls.keepExistingLayers = CheckBoxField(
            self.VAR_PREFIX + 'KeepExistingLayers',
            label="Keep existing layers",
            annotation=
            'when unselected, will delete existing layers in destination',
            defaultValue=1)
Exemplo n.º 4
0
    def createInnerUi(self, parent):

        #container = BaseTab.createScrollLayout(parent)
        rows = cmds.columnLayout(parent=parent,
                                 adjustableColumn=1,
                                 rowSpacing=Constants.MARGIN_SPACING_VERTICAL,
                                 width=400)

        BaseTab.createFixedTitledRow(rows, "Influence names")
        self.chkLongNames = CheckBoxField(
            AddPairDialog.CTRL_PREFIX + 'longNames',
            label="Longer, where ambiguous",
            annotation="Show long names in drop down boxes")
        self.chkLongNames.changeCommand.addHandler(self.updateInfluenceLabels)

        BaseTab.createFixedTitledRow(rows, "Source influence")

        self.sourceDropdown = DropDownField(self.sourceValue)

        BaseTab.createFixedTitledRow(rows, None)

        self.chkSelfReference = CheckBoxField(
            AddPairDialog.CTRL_PREFIX + 'selfReference',
            label="Self reference",
            annotation=
            "Don't map to another influence, mirror on the same influence")
        self.chkSelfReference.changeCommand.addHandler(self.updateEnabled)
        self.chkBidirectional = CheckBoxField(
            AddPairDialog.CTRL_PREFIX + 'bidirectional',
            label="Bidirectional association")

        self.destinationRow = BaseTab.createTitledRow(rows,
                                                      "Destination influence")
        self.destinationDropdown = DropDownField(self.destinationValue)

        self.updateEnabled()
        self.updateInfluenceLabels()
        self.sourceDropdown.updateModel()
        self.destinationDropdown.updateModel()
        return rows
    def createUI(self, parent):
        from mainwindow import MainWindow

        mainActions = MainWindow.getInstance().actions
        self.setTitle('Mirror')

        # base layout
        self.cmdLayout = self.createCommandLayout(
            [('Initialize', self.execInitMirror, ''),
             ('Mirror Weights', mainActions.mirrorWeights, '')],
            SkinToolsDocs.MIRRORWEIGHTS_INTERFACE)

        mainActions.mirrorWeights.addUpdateControl(self.cmdLayout.innerLayout)

        # mirror options group

        group = self.controls.mirrorOptionsGroup = self.createUIGroup(
            self.cmdLayout.innerLayout, 'Mirroring Options')

        self.createFixedTitledRow(group, 'Mirror direction')
        self.controls.mirrorDirection = DropDownField(self.VAR_PREFIX +
                                                      'mirrorDirection')
        self.rebuildMirrorDirectionDropDown()
        LayerEvents.mirrorCacheStatusChanged.addHandler(
            self.rebuildMirrorDirectionDropDown, parent)

        self.createFixedTitledRow(group, 'Mirror Seam Width')
        self.controls.mirrorWidth = FloatField(
            self.VAR_PREFIX + 'mirrorWidth',
            minValue=0,
            maxValue=None,
            step=1.0,
            defaultValue=0.1,
            annotation=
            'Defines width of the interpolation from left to right side on the model center line.'
        )
        cmds.setParent(group)
        self.createTitledRow(group, 'Elements')
        self.controls.mirrorWeights = CheckBoxField(
            self.VAR_PREFIX + 'MirrorWeights',
            label="Mirror weights",
            annotation=
            'Check this if mirror operation should be mirroring weights',
            defaultValue=1)
        self.controls.mirrorMask = CheckBoxField(
            self.VAR_PREFIX + 'MirrorMask',
            label="Mirror mask",
            annotation=
            'Check this if mirror operation should be mirroring layer mask',
            defaultValue=1)

        return self.cmdLayout.outerLayout.layout
Exemplo n.º 6
0
    def createUI(self, parent):
        group = self.rootGroup = uiGroup.create(parent, 'Vertex Mapping')
        titledRow.createFixed(group, 'Mirror Axis')
        self.mirrorAxis = DropDownField(self.VAR_PREFIX + 'mirrorAxis')
        self.mirrorAxis.setItems('X', 'Y', 'Z')
        self.mirrorAxis.changeCommand.addHandler(self.updateConfiguration,
                                                 parent)

        titledRow.create(parent=group, title="Mapping mode")
        cmds.columnLayout()
        self.transferMode = DropDownField(self.VAR_PREFIX +
                                          'vertexMirrorMappingMode')
        self.transferMode.setItems(*self.vertexTransferModes.keys())
        self.transferMode.changeCommand.addHandler(self.updateConfiguration,
                                                   parent)

        def update():
            mirrorAxis = selectionState.mirrorInfo.get()['axis']
            if mirrorAxis is not None:
                self.mirrorAxis.setValue(mirrorAxis.upper())

        selectionState.mirrorInfo.changed.addHandler(update, parent)

        update()
Exemplo n.º 7
0
    def createMirrorOptionsGroup(self):
        group = self.createUIGroup(self.cmdLayout.innerLayout,
                                   'Mirror Options')

        self.createFixedTitledRow(group, 'Mirror Axis')
        cmds.columnLayout()
        self.controls.mirrorAxis = DropDownField(self.VAR_PREFIX +
                                                 'mirrorAxis')
        self.controls.mirrorAxis.beginRebuildItems()

        for i in TransferWeightsTab.axisValues:
            self.controls.mirrorAxis.addOption(i)
        self.controls.mirrorAxis.endRebuildItems()
        self.controls.mirrorAxis.changeCommand.addHandler(
            self.previewInfluenceMapping, group)
Exemplo n.º 8
0
 def createDisplaySettingsGroup(self, parent):
     group = self.createUIGroup(parent, 'Display Settings')
     self.createTitledRow(group, 'Influence Display')
     inflDisplay = DropDownField(self.VAR_PREFIX +
                                 'influenceDisplaySetting')
     inflDisplay.addOption("All influences, multiple colors")
     inflDisplay.addOption("Current influence, grayscale gradient")
     inflDisplay.changeCommand.addHandler(self.updateColorDisplaySettings,
                                          parent)
     self.controls.inflDisplay = inflDisplay
Exemplo n.º 9
0
    def createTransferOptionsGroup(self):
        group = self.createUIGroup(self.cmdLayout.innerLayout,
                                   'Transfer Options')
        self.createTitledRow(parent=group, title="Vertex Transfer Mode")
        self.controls.transferMode = DropDownField(self.VAR_PREFIX +
                                                   'vertexTransferMode')

        for opt in CopyWeightsModel.vertexTransferModes.keys():
            self.controls.transferMode.addOption(opt)

        self.createTitledRow(parent=group, title=None)
        self.controls.keepExistingLayers = CheckBoxField(
            self.VAR_PREFIX + 'KeepExistingLayers',
            label="Keep existing layers",
            annotation=
            'when unselected, will delete existing layers in destination',
            defaultValue=1)
Exemplo n.º 10
0
    def createTabletSettingsGroup(self, parent):
        group = self.createUIGroup(parent, 'Stylus Pressure')
        titledRow.create(group, title=None)
        self.controls.stylusPressureOnOff = CheckBoxField(
            self.VAR_PREFIX + 'stylusPressureOnOff',
            label="Use stylus pressure",
            annotation='Turn stylus pressure on/off',
            defaultValue=1)
        self.controls.stylusPressureOnOff.changeCommand.addHandler(
            self.configurePaintValues, ownerUI=parent)

        titledRow.createFixed(group, title="Pressure mapping")
        mode = DropDownField(self.VAR_PREFIX + 'stylesPressureMapping')
        mode.addOption("Opacity")
        mode.addOption("Radius")
        mode.addOption("Both")
        mode.changeCommand.addHandler(self.configurePaintValues,
                                      ownerUI=parent)
        self.controls.stylusPressureMode = mode
Exemplo n.º 11
0
class VertexMappingConfiguration(object):
    VAR_PREFIX = 'ngSkinToolsMirror_vertexMappingConfiguration'
    vertexTransferModes = OrderedDict((
        ("Closest point on surface", "closestPoint"),
        ("UV space", "uvSpace"),
    ))

    def updateConfiguration(self):
        mll = MllInterface()
        mll.configureVertexMirrorMapping(
            mirrorAxis=self.mirrorAxis.getSelectedText(),
            vertexTransferMode=self.vertexTransferModes[
                self.transferMode.getSelectedText()])
        LayerEvents.mirrorConfigurationChanged.emit()

    def createUI(self, parent):
        group = self.rootGroup = uiGroup.create(parent, 'Vertex Mapping')
        titledRow.createFixed(group, 'Mirror Axis')
        self.mirrorAxis = DropDownField(self.VAR_PREFIX + 'mirrorAxis')
        self.mirrorAxis.setItems('X', 'Y', 'Z')
        self.mirrorAxis.changeCommand.addHandler(self.updateConfiguration,
                                                 parent)

        titledRow.create(parent=group, title="Mapping mode")
        cmds.columnLayout()
        self.transferMode = DropDownField(self.VAR_PREFIX +
                                          'vertexMirrorMappingMode')
        self.transferMode.setItems(*self.vertexTransferModes.keys())
        self.transferMode.changeCommand.addHandler(self.updateConfiguration,
                                                   parent)

        def update():
            mirrorAxis = selectionState.mirrorInfo.get()['axis']
            if mirrorAxis is not None:
                self.mirrorAxis.setValue(mirrorAxis.upper())

        selectionState.mirrorInfo.changed.addHandler(update, parent)

        update()
Exemplo n.º 12
0
    def createUI(self, parent):
        group = self.mirrorOptionsGroup = uiGroup.create(
            parent, 'Mirroring Options')

        titledRow.createFixed(group, 'Mirror direction')
        self.mirrorDirection = DropDownField(self.VAR_PREFIX +
                                             'mirrorDirection')

        def getMirrorSideTexts():
            axis = selectionState.mirrorInfo.get()['axis']
            if axis is None:
                axis = 'x'
            return self.MIRROR_TEXTS[axis]

        def rebuildMirrorDirectionDropDown():
            self.mirrorDirection.beginRebuildItems()
            self.mirrorDirection.addOption(self.MIRROR_GUESS)
            for mirrorText in getMirrorSideTexts():
                self.mirrorDirection.addOption(mirrorText)
            self.mirrorDirection.addOption(self.MIRROR_FLIP)
            self.mirrorDirection.endRebuildItems()

        selectionState.mirrorInfo.changed.addHandler(
            rebuildMirrorDirectionDropDown, parent)

        def updateEnabled():
            data = LayerDataModel.getInstance()
            self.mirrorDq.setEnabled(data.layerDataAvailable
                                     and data.isDqMode())

        MayaEvents.nodeSelectionChanged.addHandler(updateEnabled, parent)

        titledRow.createFixed(group, 'Mirror Seam Width')
        self.mirrorWidth = FloatField(
            self.VAR_PREFIX + 'mirrorWidth',
            minValue=0,
            maxValue=None,
            step=1.0,
            defaultValue=0.1,
            annotation=
            'Defines width of the interpolation from left to right side on the model center line.'
        )
        cmds.setParent(group)
        titledRow.create(group, 'Elements')
        self.mirrorWeights = CheckBoxField(
            self.VAR_PREFIX + 'MirrorWeights',
            label="Mirror weights",
            annotation=
            'Check this if mirror operation should be mirroring weights',
            defaultValue=1)
        self.mirrorMask = CheckBoxField(
            self.VAR_PREFIX + 'MirrorMask',
            label="Mirror mask",
            annotation=
            'Check this if mirror operation should be mirroring layer mask',
            defaultValue=1)
        self.mirrorDq = CheckBoxField(
            self.VAR_PREFIX + 'MirrorDualQuaternion',
            label="Mirror dual quaternion weights",
            annotation=
            'Check this if mirror operation should be mirroring dual quaternion weights',
            defaultValue=1)

        LayerEvents.mirrorConfigurationChanged.addHandler(
            rebuildMirrorDirectionDropDown, parent)
        rebuildMirrorDirectionDropDown()
        updateEnabled()
Exemplo n.º 13
0
class VertexMirroringOptions(object):
    VAR_PREFIX = 'ngSkinToolsMirror_mirroringOptions'
    MIRROR_TEXTS = {
        'x': ("Left to right (+X to -X)", "Right to left (-X to +X)"),
        'y': ("Top to bottom (+Y to -Y)", "Bottom to top (-Y to +Y)"),
        'z': ("Front to back (+Z to -Z)", "Back to front (-Z to +Z)"),
    }

    MIRROR_GUESS = 'Guess from stroke'
    MIRROR_FLIP = 'Flip'

    def createUI(self, parent):
        group = self.mirrorOptionsGroup = uiGroup.create(
            parent, 'Mirroring Options')

        titledRow.createFixed(group, 'Mirror direction')
        self.mirrorDirection = DropDownField(self.VAR_PREFIX +
                                             'mirrorDirection')

        def getMirrorSideTexts():
            axis = selectionState.mirrorInfo.get()['axis']
            if axis is None:
                axis = 'x'
            return self.MIRROR_TEXTS[axis]

        def rebuildMirrorDirectionDropDown():
            self.mirrorDirection.beginRebuildItems()
            self.mirrorDirection.addOption(self.MIRROR_GUESS)
            for mirrorText in getMirrorSideTexts():
                self.mirrorDirection.addOption(mirrorText)
            self.mirrorDirection.addOption(self.MIRROR_FLIP)
            self.mirrorDirection.endRebuildItems()

        selectionState.mirrorInfo.changed.addHandler(
            rebuildMirrorDirectionDropDown, parent)

        def updateEnabled():
            data = LayerDataModel.getInstance()
            self.mirrorDq.setEnabled(data.layerDataAvailable
                                     and data.isDqMode())

        MayaEvents.nodeSelectionChanged.addHandler(updateEnabled, parent)

        titledRow.createFixed(group, 'Mirror Seam Width')
        self.mirrorWidth = FloatField(
            self.VAR_PREFIX + 'mirrorWidth',
            minValue=0,
            maxValue=None,
            step=1.0,
            defaultValue=0.1,
            annotation=
            'Defines width of the interpolation from left to right side on the model center line.'
        )
        cmds.setParent(group)
        titledRow.create(group, 'Elements')
        self.mirrorWeights = CheckBoxField(
            self.VAR_PREFIX + 'MirrorWeights',
            label="Mirror weights",
            annotation=
            'Check this if mirror operation should be mirroring weights',
            defaultValue=1)
        self.mirrorMask = CheckBoxField(
            self.VAR_PREFIX + 'MirrorMask',
            label="Mirror mask",
            annotation=
            'Check this if mirror operation should be mirroring layer mask',
            defaultValue=1)
        self.mirrorDq = CheckBoxField(
            self.VAR_PREFIX + 'MirrorDualQuaternion',
            label="Mirror dual quaternion weights",
            annotation=
            'Check this if mirror operation should be mirroring dual quaternion weights',
            defaultValue=1)

        LayerEvents.mirrorConfigurationChanged.addHandler(
            rebuildMirrorDirectionDropDown, parent)
        rebuildMirrorDirectionDropDown()
        updateEnabled()
Exemplo n.º 14
0
class AddPairDialog(BaseDialog):
    CTRL_PREFIX = 'ngSkinToolsAddPairDialog_'

    def __init__(self):
        BaseDialog.__init__(self)
        self.title = "Add Influences Association"
        self.sourceValue = ValueModel()
        self.destinationValue = ValueModel()
        self.buttons = [self.BUTTON_OK, self.BUTTON_CANCEL]

    def updateEnabled(self):
        cmds.layout(self.destinationRow,
                    e=True,
                    enable=not self.chkSelfReference.getValue())
        self.chkBidirectional.setEnabled(not self.chkSelfReference.getValue())

    def getAvailableInfluences(self):
        result = []
        layerInfluences = cmds.ngSkinLayer(q=True, listLayerInfluences=True)
        for index, i in enumerate(layerInfluences):
            if index % 2 != 0:
                result.append(i)
        return result

    def createInnerUi(self, parent):

        #container = BaseTab.createScrollLayout(parent)
        rows = cmds.columnLayout(parent=parent,
                                 adjustableColumn=1,
                                 rowSpacing=Constants.MARGIN_SPACING_VERTICAL,
                                 width=400)

        BaseTab.createFixedTitledRow(rows, "Influence names")
        self.chkLongNames = CheckBoxField(
            AddPairDialog.CTRL_PREFIX + 'longNames',
            label="Longer, where ambiguous",
            annotation="Show long names in drop down boxes")
        self.chkLongNames.changeCommand.addHandler(self.updateInfluenceLabels)

        BaseTab.createFixedTitledRow(rows, "Source influence")

        self.sourceDropdown = DropDownField(self.sourceValue)

        BaseTab.createFixedTitledRow(rows, None)

        self.chkSelfReference = CheckBoxField(
            AddPairDialog.CTRL_PREFIX + 'selfReference',
            label="Self reference",
            annotation=
            "Don't map to another influence, mirror on the same influence")
        self.chkSelfReference.changeCommand.addHandler(self.updateEnabled)
        self.chkBidirectional = CheckBoxField(
            AddPairDialog.CTRL_PREFIX + 'bidirectional',
            label="Bidirectional association")

        self.destinationRow = BaseTab.createTitledRow(rows,
                                                      "Destination influence")
        self.destinationDropdown = DropDownField(self.destinationValue)

        self.updateEnabled()
        self.updateInfluenceLabels()
        self.sourceDropdown.updateModel()
        self.destinationDropdown.updateModel()
        return rows

    def updateInfluenceLabels(self):
        self.influences = self.getAvailableInfluences()
        self.sourceDropdown.clear()
        self.destinationDropdown.clear()

        if self.chkLongNames.getValue():
            nameProcessor = lambda name: cmds.ls(name)[0]
        else:
            nameProcessor = InfluencesListEntry.shortName

        for i in self.influences:
            self.sourceDropdown.addOption(nameProcessor(i))
        for i in self.influences:
            self.destinationDropdown.addOption(nameProcessor(i))

    def getSourceInfluence(self):
        return self.influences[self.sourceDropdown.model.get()]

    def getDestinationInfluence(self):
        return self.influences[self.destinationDropdown.model.get()]
Exemplo n.º 15
0
class AddPairDialog(BaseDialog):
    CTRL_PREFIX = 'ngSkinToolsAddPairDialog_'
    
    def __init__(self):
        BaseDialog.__init__(self)
        self.title = "Add Influences Association"
        self.sourceValue = ValueModel()
        self.destinationValue = ValueModel()
        self.buttons = [self.BUTTON_OK,self.BUTTON_CANCEL]
        
    def updateEnabled(self):
        cmds.layout(self.destinationRow,e=True,enable=not self.chkSelfReference.getValue())
        self.chkBidirectional.setEnabled(not self.chkSelfReference.getValue())
        
    def getAvailableInfluences(self):
        result = []
        layerInfluences = cmds.ngSkinLayer(q=True,listLayerInfluences=True) 
        for index,i in enumerate(layerInfluences):
            if index%2!=0:
                result.append(i)
        return result
        
    def createInnerUi(self,parent):
        
        #container = BaseTab.createScrollLayout(parent)
        rows=cmds.columnLayout(parent=parent,
            adjustableColumn=1,rowSpacing=Constants.MARGIN_SPACING_VERTICAL,
            width=400)
        
        BaseTab.createFixedTitledRow(rows, "Influence names")
        self.chkLongNames = CheckBoxField(AddPairDialog.CTRL_PREFIX+'longNames',label="Longer, where ambiguous",annotation="Show long names in drop down boxes")
        self.chkLongNames.changeCommand.addHandler(self.updateInfluenceLabels)
        
        BaseTab.createFixedTitledRow(rows, "Source influence")
        
        
        self.sourceDropdown = DropDownField(self.sourceValue)

        BaseTab.createFixedTitledRow(rows, None)

        self.chkSelfReference = CheckBoxField(AddPairDialog.CTRL_PREFIX+'selfReference',label="Self reference",annotation="Don't map to another influence, mirror on the same influence")
        self.chkSelfReference.changeCommand.addHandler(self.updateEnabled)
        self.chkBidirectional = CheckBoxField(AddPairDialog.CTRL_PREFIX+'bidirectional',label="Bidirectional association")
            
 
        self.destinationRow = BaseTab.createTitledRow(rows, "Destination influence")
        self.destinationDropdown = DropDownField(self.destinationValue)
        
        self.updateEnabled()
        self.updateInfluenceLabels()
        self.sourceDropdown.updateModel()
        self.destinationDropdown.updateModel()
        return rows
    
    def updateInfluenceLabels(self):
        self.influences = self.getAvailableInfluences()
        self.sourceDropdown.clear()
        self.destinationDropdown.clear()
        
        if self.chkLongNames.getValue():
            nameProcessor = lambda name: cmds.ls(name)[0]
        else:
            nameProcessor = InfluencesListEntry.shortName
        
        for i in self.influences:
            self.sourceDropdown.addOption(nameProcessor(i))
        for i in self.influences:
            self.destinationDropdown.addOption(nameProcessor(i))
            
    def getSourceInfluence(self):
        return self.influences[self.sourceDropdown.model.get()]
    
    def getDestinationInfluence(self):
        return self.influences[self.destinationDropdown.model.get()]